学了挺长时间flutter,最近才发现原来它也可以写控制台应用,而且很方便,这里学习记录一下。
我用的flutter版本是2.5.1,用更高的也可以,用低的话就不支持空安全了。
使用命令
dart create console_project
console_project是项目名字,这样就创建好了一个基本的console工程。工程中只有一个dart文件,为了方便我将它命名成main.dart , pubspec.yaml也要一起要改一下名字。main.dart文件中只有一个main函数。
这里要用到两个重要的类CommandRunner和Command,Command用来定义一个命令,可以在 CommandRunner中添加多个Command。
class BuildCommand extends Command<void> {
String get description => "build command";
// 重要,build就是我们要运行的命令
String get name => "build";
BuildCommand() {
// todo 添加命令参数,下面说
}
void run() {
// todo 解析参数
}
}
上面自定义的BuildCommand中有几个比较重要的方法,name指定这个命令的名称。
先添加上args库用来帮助我们解析命令,自己处理很麻烦
args: ^2.0.0
下面举一个实际的例子,假设我们希望输入命令 commit --m “first commit” --all 时,能自动把所有文件添加到git仓库中,command就可以实现为
class CommitCommand extends Command<void> {
@override
String get description => "";
@override
String get name => "commit";
CommitCommand() {
argParser.addOption("m");
argParser.addFlag('all', negatable: false);
}
@override
void run() {
String msg = argResults!['m'] as String;
bool all = argResults!['all'] as bool;
if (all){
runCommand('git add .', []);
runCommand('git commit -m ', [msg]);
}
}
}
在构造函数中添加参数,一般只需要添加两种,一种是Option, 例如argParser.addOption(“m”); 输入时对应的参数是 --m “first commit”,后面需要跟上它对应的参数;另一种是Flag, 例如argParser.addFlag(‘all’, negatable: false); 它输入对应的是–all,后面不需要带参数,表示一个bool型的值。
在run函数中,就可以将定义的option 和flag取出来了。
String msg = argResults!['m'] as String;
bool all = argResults!['all'] as bool;
上面的argParser和argResults都是定义在Command类中的。runCommand是我重新写的一个函数来执行终端命令,可以借助process_run这个库来运行终端命令。
定义好一个命令和对应的处理逻辑后,把它们添加到CommandRunner中,就可以运行了。
void main(List<String> arguments) {
var runner = CommandRunner('dart_tool', "自定义命令行工具");
runner.addCommand(CommitCommand());
runner.addCommand(BuildCommand());
runner.run(arguments).catchError((error) {
print("error: $error");
});
}
终端输入
dart bin/main.dart commit --m "first commit" --all
就可以运行我们的命令了。如果输出错误的命令可以看到提示
➜ console-project git:(main) ✗ dart bin/main.dart buildbuild
error: Could not find a command named "buildbuild".
Usage: dart_tool <command> [arguments]
Global options:
-h, --help Print this usage information.
Available commands:
build build command
commit git commit
Run "dart_tool help " for more information about a command.