Flutter终端模拟插件terminal_library_flutter的使用

Flutter终端模拟插件terminal_library_flutter的使用

terminal_library_flutter 是一个用于在 Flutter 应用程序中集成终端模拟器的库。它支持跨平台,包括设备、边缘服务器函数等。

演示

文档

  1. 文档
  2. YouTube
  3. Telegram 支持群组
  4. 联系开发者(检查社交媒体或 readme 文件中的 GitHub 个人资料)

特性

  1. ✅ 📱️ 跨平台 支持(设备、边缘服务器函数)
  2. ✅ 📜️ 标准化 样式代码
  3. ✅ ⌨️ CLI(帮助你使用此库或创建项目)
  4. ✅ 🔥️ API(如果你开发机器人/用户机器人,可以使用此库而无需与 CLI 交互,只需添加库并使用 🚀️)
  5. ❌ 🧩️ 可自定义扩展(如果你想添加扩展,可以加快开发速度)
  6. ❌ ✨️ 漂亮的信息(对新手友好)

趣闻

该库可以在所有平台上运行(命令行界面、服务器、Web、GUI),忽略 Flutter 标志仅在 pub.dev 上可见。

安装库

  1. Dart
    dart pub add terminal_library
    
  2. Flutter
    flutter pub add terminal_library
    

使用此项目的示例项目

  1. 通用工作室开发应用程序
  2. 通用机器人应用/通用自动化应用
  3. 通用应用程序

快速开始

以下是一个简单的快速入门脚本,以帮助你了解如何使用此库。

// 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

1 回复

更多关于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';
        }
      },
    );
  }
}
回到顶部