Flutter终端模拟插件terminal_library_flutter的使用
Flutter终端模拟插件terminal_library_flutter
的使用
terminal_library_flutter
是一个用于在 Flutter 应用程序中集成终端模拟器的库。它支持跨平台,包括设备、边缘服务器函数等。
演示
文档
- 文档
- YouTube
- Telegram 支持群组
- 联系开发者(检查社交媒体或 readme 文件中的 GitHub 个人资料)
特性
- ✅ 📱️ 跨平台 支持(设备、边缘服务器函数)
- ✅ 📜️ 标准化 样式代码
- ✅ ⌨️ CLI(帮助你使用此库或创建项目)
- ✅ 🔥️ API(如果你开发机器人/用户机器人,可以使用此库而无需与 CLI 交互,只需添加库并使用 🚀️)
- ❌ 🧩️ 可自定义扩展(如果你想添加扩展,可以加快开发速度)
- ❌ ✨️ 漂亮的信息(对新手友好)
趣闻
该库可以在所有平台上运行(命令行界面、服务器、Web、GUI),忽略 Flutter 标志仅在 pub.dev 上可见。
安装库
- Dart
dart pub add terminal_library
- Flutter
flutter pub add terminal_library
使用此项目的示例项目
- 通用工作室开发应用程序
- 通用机器人应用/通用自动化应用
- 通用应用程序
快速开始
以下是一个简单的快速入门脚本,以帮助你了解如何使用此库。
// ignore_for_file: empty_catches, non_constant_identifier_names
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:general_lib/general_lib.dart';
import 'package:general_lib_flutter/extension/build_context.dart';
import 'package:general_lib_flutter/widget/widget.dart';
import 'package:terminal_library/pty_library/pty_library.dart';
import 'package:terminal_library/xterm_library/xterm.dart';
void main(List<String> args) {
WidgetsFlutterBinding.ensureInitialized();
runApp(const App());
}
class App extends StatelessWidget {
static GeneralLibFlutterApp generalLibFlutterApp = GeneralLibFlutterApp();
const App({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return GeneralLibFlutterAppMain(
generalLibFlutterApp: generalLibFlutterApp,
builder: (themeMode, lightTheme, darkTheme, widget) {
Widget child = MaterialApp(
theme: lightTheme,
darkTheme: darkTheme,
themeMode: themeMode,
debugShowCheckedModeBanner: false,
home: const MyApp(),
);
return child;
},
);
}
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
TerminalLibraryFlutterController terminalLibraryFlutterController = TerminalLibraryFlutterController();
final TerminalLibraryFlutter terminalLibraryFlutter = TerminalLibraryFlutter(
maxLines: 1000,
);
late final PtyLibrary ptyLibrary;
[@override](/user/override)
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
await refresh();
});
}
[@override](/user/override)
void dispose() {
ptyLibrary.kill();
terminalLibraryFlutterController.dispose();
super.dispose();
}
bool is_loading = false;
Future<void> refresh() async {
if (is_loading) {
return;
}
setState(() {
is_loading = true;
});
await Future(() async {
await Future.delayed(Duration(milliseconds: 500)); // Durations.short1
ptyLibrary = PtyLibrary.start(
shell,
columns: terminalLibraryFlutter.viewWidth,
rows: terminalLibraryFlutter.viewHeight,
);
ptyLibrary.output.listen((event) {
if (event.isNotEmpty) {
try {
terminalLibraryFlutter.write(utf8.decode(event, allowMalformed: true));
} catch (e) {}
}
});
terminalLibraryFlutter.onOutput = (String value) {
if (value.isNotEmpty) {
try {
ptyLibrary.write(utf8.encode(value));
} catch (e) {}
}
};
terminalLibraryFlutter.onResize = (w, h, pw, ph) {
ptyLibrary.resize(h, w);
};
terminalLibraryFlutter.buffer.clear();
terminalLibraryFlutter.buffer.setCursor(0, 0);
terminalLibraryFlutter.textInput("clear");
terminalLibraryFlutter.keyInput(TerminalLibraryFlutterKey.enter);
setState(() {});
});
setState(() {
is_loading = false;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
if (is_loading) {
return Scaffold(
body: Center(
child: CircularProgressIndicator(
color: context.theme.indicatorColor,
),
),
);
}
return Scaffold(
appBar: AppBar(
title: const Text("终端库:"),
),
body: TerminalLibraryFlutterViewWidget(
terminalLibraryFlutter,
controller: terminalLibraryFlutterController,
autofocus: true,
backgroundOpacity: 0,
simulateScroll: true,
padding: const EdgeInsets.all(5),
alwaysShowCursor: true,
deleteDetection: Platform.isMobile,
),
);
}
static String get shell {
if (Platform.isMacOS || Platform.isLinux) {
return Platform.environment['SHELL'] ?? 'bash';
}
if (Platform.isWindows) {
return 'cmd.exe';
}
return 'sh';
}
}
更多关于Flutter终端模拟插件terminal_library_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter终端模拟插件terminal_library_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
terminal_library_flutter
是一个用于在 Flutter 应用中嵌入终端模拟器的插件。它可以让你在应用中运行命令行命令,并显示命令的输出。以下是使用 terminal_library_flutter
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 terminal_library_flutter
依赖:
dependencies:
flutter:
sdk: flutter
terminal_library_flutter: ^1.0.0 # 使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入库
在你的 Dart 文件中导入 terminal_library_flutter
:
import 'package:terminal_library_flutter/terminal_library_flutter.dart';
3. 使用 Terminal Widget
你可以在你的 Flutter 应用中使用 Terminal
widget 来显示终端界面。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:terminal_library_flutter/terminal_library_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Terminal Example'),
),
body: TerminalWidget(),
),
);
}
}
class TerminalWidget extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Terminal(
onCommand: (command) {
// 处理用户输入的命令
print('Command: $command');
// 模拟命令执行
return 'Executing: $command\n';
},
);
}
}
4. 处理命令输入
Terminal
widget 提供了一个 onCommand
回调函数,当用户在终端中输入命令并按下回车键时,这个回调函数会被调用。你可以在回调函数中处理命令并返回输出。
在上面的示例中,onCommand
函数简单地打印了用户输入的命令,并返回了一个模拟的输出。
5. 自定义终端样式
你可以通过 Terminal
widget 的参数来自定义终端的样式,例如背景颜色、文本颜色等。
Terminal(
onCommand: (command) {
return 'Executing: $command\n';
},
style: TerminalStyle(
backgroundColor: Colors.black,
textColor: Colors.white,
fontSize: 14.0,
),
)
6. 运行命令
你可以在 onCommand
回调中执行实际的命令。例如,你可以使用 Process.run
来执行系统命令并返回输出。
import 'dart:io';
class TerminalWidget extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Terminal(
onCommand: (command) async {
try {
var result = await Process.run(command, []);
return result.stdout.toString();
} catch (e) {
return 'Error: $e';
}
},
);
}
}