开源一个Flutter编写的简易终端模拟器

在 Android 原生中执行 shell 可以使用 Runtime 的这些类,更多的会选择第三方开发者封装好的库来调用 shell,完整的终端模拟器,如 termux,Android Terminal 等都涉及到一些 jni 通信,C 语言中 system 函数可以执行命令行命令,python 中则是 os.system 函数,各类语言都有执行命令行的函数与方法,在 dart 中,我们通过 Process 类来实现这些功能

这是我一直为我的工具箱维护的功能之一,一个简易的终端模拟器,起初的实现涉及到了大量的与原生之间 Plugin 的调用,后来慢慢的将所有功能的实现迁移到纯 Flutter 中,现在来开源几个页面

先看一下在安卓跟 Mac 上的运行效果

gif

gif

其它平台还待测试

上面就是同一套代码跑出来的,Flutter 在 Mac 上的性能也越来越好了哈哈,不过最新的 master 分支 Textfield 无法输入空格
整个页面就一个 dart 文件,写得比较烂,大部分的业务逻辑起码都是半年前的了,也没怎么变动,我直接从我工具箱项目 copy 出来的,有些与外部耦合的变量我直接弄成全局变量了,我的工具箱很多地方会以弹窗的方式依赖这个页面

Process 类

关于 Process 类的使用,我也是先查了相应的帖子,最后发现 dart 官网中有提到,直接看 Process 类这个文件读起来问题也不大
简单说,Process.run 可以执行一行 sh 命令,不过执行完后这个进程就会退出,返回的为一个 ProcessResult 对象,这个对象包含了,stdout,stderr,exitcode 这些,而 Porcess.start 会持续维持这个进程,直到输入 exit,它返回的是 Process 对象,通过这个对象即可对它的 stdout,stderr 进行监听,执行 stdin.write 这些操作。

一点细节

这个进程不会关闭,那我们是如何知道一条命令什么时候执行结束呢
例如

1
2
find
sleep

这类需要耗时的命令 ,我用了一点小技巧还获取何时来告诉用户这条命令执行结束,无论输入什么样的命令,我都在之后跟一行 echo exitCode=$?,其实$?是 Linux 得到上一行命令退出的代码,这样不仅能知道上一行代码什么时候运行结束,还拿到了它的退出代码

地址

https://github.com/Nightmare-MYS/flutter_terminal

MToolkit 下载地址

下一篇应该会开源 Flutter 编写的文件管理器,代码都还有很多问题,包括很多命名不规范的地方,我慢慢完善

作者

梦魇兽

发布于

2020-02-16

更新于

2023-03-11

许可协议

评论