Flutter参数处理插件smart_arg的使用
Flutter参数处理插件smart_arg的使用
smart_arg
是一个用于解析命令行参数的插件,它通过注解的方式将参数存储在类中,从而实现静态类型检查和代码补全。以下是关于如何使用 smart_arg
的完整示例。
简单示例
import 'dart:io';
import 'package:smart_arg/smart_arg.dart';
// 引入reflectable生成的文件
import 'readme_example.reflectable.dart';
[@SmartArg](/user/SmartArg).reflectable
[@Parser](/user/Parser)(description: 'Hello World application')
class Args extends SmartArg {
// 定义一个字符串类型的参数,并设置帮助信息和环境变量
@StringArgument(
help: 'Name of person to say hello to',
environmentVariable: "GREETING_NAME",
)
String name = 'World'; // 默认值为 "World"
// 定义另一个字符串类型的参数,并限制其取值范围
@StringArgument(
help: 'Message to say to person',
mustBeOneOf: ['Hello', 'Goodbye'],
environmentVariable: 'GREETING_TYPE',
)
String greeting = 'Hello'; // 默认值为 "Hello"
// 定义一个整数类型的参数,并设置其为必填项,以及最小最大值
@IntegerArgument(
help: 'Number of times to greet the person',
isRequired: true,
minimum: 1,
maximum: 100,
environmentVariable: 'GREETING_COUNT',
)
late int count;
// 定义一个帮助参数
[@HelpArgument](/user/HelpArgument)()
bool help = false;
}
void main(List<String> arguments) {
initializeReflectable(); // 初始化reflectable
var args = Args()..parse(arguments); // 解析命令行参数
if (args.help) {
print(args.usage()); // 打印帮助信息
exit(0);
}
for (var i = 0; i < args.count; i++) {
print('${args.greeting}, ${args.name}!'); // 输出问候语
}
}
帮助输出
上述示例的帮助输出如下:
Hello World application
--name Name of person to say hello to
[Environment Variable: $GREETING_NAME]
--greeting Message to say to person
[Environment Variable: $GREETING_TYPE]
must be one of Hello, Goodbye
--count Number of times to greet the person
[REQUIRED]
[Environment Variable: $GREETING_COUNT]
-h, --help, -? Show help
构建过程
smart_arg
依赖于 reflectable
包,因此需要在构建过程中添加相应的配置。你的 build.yaml
文件应类似于以下内容:
targets:
$default:
builders:
reflectable:
generate_for:
- bin/main.dart
每次修改 SmartArg
类或执行程序前,必须运行以下命令来生成必要的反射代码:
$ pub run build_runner build
完整示例
以下是一个更复杂的示例,展示了如何使用 smart_arg
来处理多组参数和命令:
import 'dart:io';
import 'package:smart_arg/smart_arg.dart';
// 引入reflectable生成的文件
import 'command_example.reflectable.dart';
[@SmartArg](/user/SmartArg).reflectable
[@Parser](/user/Parser)(description: 'get file from remote server')
class GetCommand extends SmartArgCommand {
[@BooleanArgument](/user/BooleanArgument)(help: 'Should the file be removed after downloaded?')
bool? removeAfterGet;
[@HelpArgument](/user/HelpArgument)()
bool? help;
[@override](/user/override)
void execute(SmartArg parentArguments) {
if (help == true) {
print(usage());
exit(0);
}
if ((parentArguments as Args).verbose == true) {
print('Verbose is on');
} else {
print('Verbose is off');
}
print('Getting file...');
if (removeAfterGet == true) {
print('Removing file on remote server (not really)');
}
}
}
[@SmartArg](/user/SmartArg).reflectable
[@Parser](/user/Parser)(description: 'put file onto remote server')
class PutCommand extends SmartArgCommand {
[@BooleanArgument](/user/BooleanArgument)(help: 'Should the file be removed locally after downloaded?')
bool? removeAfterPut;
[@HelpArgument](/user/HelpArgument)()
bool? help;
[@override](/user/override)
void execute(SmartArg parentArguments) {
if (help == true) {
print(usage());
exit(0);
}
if ((parentArguments as Args).verbose == true) {
print('Verbose is on');
} else {
print('Verbose is off');
}
print('Putting file...');
if (removeAfterPut == true) {
print('Removing file on local disk (not really)');
}
}
}
[@SmartArg](/user/SmartArg).reflectable
[@Parser](/user/Parser)(
description: 'Example using commands',
extendedHelp: [
ExtendedHelp('This is some text below the command listing',
header: 'EXTENDED HELP')
],
)
class Args extends SmartArg {
[@BooleanArgument](/user/BooleanArgument)(short: 'v', help: 'Verbose mode')
bool? verbose;
[@Command](/user/Command)(help: 'Get a file from the remote server')
GetCommand? get;
[@Command](/user/Command)(help: 'Put a file on the remote server')
PutCommand? put;
[@HelpArgument](/user/HelpArgument)()
bool? help;
}
void main(List<String> arguments) {
initializeReflectable();
var args = Args()..parse(arguments);
if (args.help == true) {
print(args.usage());
exit(0);
}
}
更多关于Flutter参数处理插件smart_arg的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter参数处理插件smart_arg的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用smart_arg
插件来处理命令行参数的示例代码。smart_arg
是一个方便的工具,用于解析和处理Flutter应用的命令行参数。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加smart_arg
依赖:
dependencies:
flutter:
sdk: flutter
smart_arg: ^x.y.z # 请使用最新版本号替换x.y.z
然后运行flutter pub get
来获取依赖。
2. 创建参数定义类
接下来,你需要创建一个类来定义你的命令行参数。例如,假设你想处理两个参数:--name
和--age
:
import 'package:smart_arg/smart_arg.dart';
class MyArgs extends ArgParser {
@Arg(
abbr: 'n',
help: 'Your name',
)
String? name;
@Arg(
abbr: 'a',
help: 'Your age',
transformer: int.parse,
)
int? age;
}
在这个例子中,@Arg
注解用于标记参数,abbr
属性表示参数的缩写,help
属性提供参数的帮助信息,transformer
属性用于将参数值转换为特定类型。
3. 解析参数
在你的Flutter应用的入口点(通常是main.dart
),你可以解析这些参数:
import 'package:flutter/material.dart';
import 'my_args.dart'; // 假设你把参数定义类放在了my_args.dart文件中
void main() async {
final MyArgs args = MyArgs.parse();
runApp(MyApp(
name: args.name,
age: args.age,
));
}
class MyApp extends StatelessWidget {
final String? name;
final int? age;
MyApp({this.name, this.age});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Arg Parsing Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Name: ${name ?? 'Not provided'}'),
Text('Age: ${age ?? 'Not provided'}'),
],
),
),
),
);
}
}
4. 运行应用并传递参数
现在,你可以通过命令行运行你的Flutter应用并传递参数。例如:
flutter run --dart-define=FLUTTER_ENV=prod --name=John --age=30
请注意,--dart-define
是Flutter的内置参数,用于传递编译时定义的值,而--name
和--age
是我们定义的参数。由于smart_arg
目前不支持直接从flutter run
命令解析自定义参数(这些参数通常会被Flutter工具链忽略),你可能需要在实际部署(如通过命令行脚本启动应用)时才能看到这些自定义参数的效果。
如果你希望在开发过程中测试这些参数,你可以考虑使用flutter tools
或其他方法来启动你的应用,并手动传递这些参数。
注意事项
smart_arg
库可能不支持直接从flutter run
命令中解析自定义参数,因此在开发过程中,你可能需要采用其他方法来测试参数解析功能。- 确保使用最新版本的
smart_arg
库,因为库的API可能会随着版本的更新而变化。
希望这个示例代码能帮助你理解如何在Flutter项目中使用smart_arg
插件来处理命令行参数。