Flutter参数处理插件smart_arg的使用

发布于 1周前 作者 sinazl 来自 Flutter

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

1 回复

更多关于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插件来处理命令行参数。

回到顶部