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

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

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

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

开源一个Flutter编写的简易终端模拟器_第1张图片

其它平台还待测试

上面就是同一套代码跑出来的,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这些操作。

一点细节

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

find
sleep

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

地址

https://github.com/Nightmare-MYS/flutter_terminal
MToolkit下载地址
下一篇应该会开源Flutter编写的文件管理器,代码都还有很多问题,包括很多命名不规范的地方,我慢慢完善

你可能感兴趣的:(Flutter)