【问题标题】:How do you pass arguments from command line to main in Flutter/Dart?如何在 Flutter/Dart 中将参数从命令行传递到 main?
【发布时间】:2019-07-27 00:12:28
【问题描述】:

您将如何运行命令并使用 Flutter/Dart 传递一些自定义参数,以便可以在 main() 调用中访问它们,例如:

flutter run -device [my custom arg]

那么我可以通过以下方式访问它:

void main(List<String> args) {
  print(args.toString());
}

谢谢。

【问题讨论】:

    标签: dart flutter command main args


    【解决方案1】:

    没有办法做到这一点,因为当您在设备上启动应用程序时,也没有传递任何参数。

    如果这是用于开发,您可以将-t lib/my_alternate_main.dart 传递给 flutter run 轻松切换不同设置
    其中每个备用入口点文件使用不同的参数或不同的初始化全局变量调用相同的应用程序代码。

    更新

    对于

    • flutter run
    • flutter build apk
    • flutter build ios
    • flutter drive

    为此添加了--dart-define=... 命令行参数。

    附加的键值对将作为常量从 String.fromEnvironment、bool.fromEnvironment、int.fromEnvironment 和 double.fromEnvironment 构造函数中获得。

    更多详情见Flutter 1.17 no more Flavors, no more iOS Schemas. Command argument that changes everything

    示例

    const t = String.fromEnvironment("TEST");
    
    flutter run --dart-define="TEST=from command line"
    

    请注意const 是必需的,并且变量名区分大小写。

    【讨论】:

    • 我一直将它与 CI 的环境变量一起使用,因此它可以运行 iOS 和 Android 测试。只是想确定它是否受支持,如果是,我会使用 main() args 代替。谢谢。
    • 值得一提的是,这也适用于flutter build
    • --dart-define 恢复了github.com/flutter/flutter/pull/52041,我无法让它工作
    • 从今天起 Flutter (Channel master, 1.19.0-2.0.pre, on Mac OS X 10.15.5) --dart-define 不能正常返回空值,如上所述 --dart-定义恢复了github.com/flutter/flutter/pull/52041,我也无法让它工作
    • @Cristiano 是的,你自己试试看很容易;D 确保你拥有最新的 Flutter 版本。此功能相当新,但 AFAIK 它已经稳定。我自己只在开发中尝试过。
    【解决方案2】:

    Android 工作室

    向 Android Studio Flutter 项目添加命令行参数/环境变量。


    编辑

    运行 > 编辑配置...

    或 单击配置下拉选择器

    添加

    Additional arguments 中添加您的参数(如果没有空格,则引号可选) 2.如果你喜欢,添加一个描述性的名字

    复制

    单击复制按钮可根据需要轻松添加更多配置版本

    选择

    从下拉列表中选择您的运行配置

    使用

    在代码中使用你的参数

    例如

    const String version = String.fromEnvironment('VERSION');

    【讨论】:

      【解决方案3】:

      -dart-define 在稳定版 1.17 中工作

      从命令行

      flutter run --dart-define=myVar="some value"
      

      以 main.dart 为例:

      const MY_VAR = String.fromEnvironment('myVar', defaultValue: 'SOME_DEFAULT_VALUE');
      

      【讨论】:

      • 你试过 Flutter(Channel master,1.19.0-2.0.pre,在 Mac OS X 10.15.5 上)对我没用
      • 如何从 Android Studio 构建中执行此操作(单击绿色运行箭头)
      • @SultanmyrzaKasymbekov 没错,适用于 Android,但在 android(相对于 iOS)上,您可以将 main 方法定义在不必命名为 main.dart 的 dart 文件中。在 iOS 上,没有 dart 定义被传递到环境中。我认为这篇文章link 可能仍然具有相关性。
      【解决方案4】:

      main 方法的参数可以用参数--dart-entrypoint-args(简称:-a)来声明,例如

      flutter run -d linux --dart-entrypoint-args some_file.xml
      

      【讨论】:

      • 这是传递命令行参数的唯一真正解决方案,它们等效于传递给编译后的exe文件的参数。
      【解决方案5】:

      我遇到了同样的问题,所以我写了一个包和一些可以提供帮助的说明。

      https://pub.dev/packages/launch_args

      我不知道通过flutter 命令传递参数的方法。据我所知,您必须首先通过 Flutter 构建应用程序,然后使用其他 CLI 传递工具。

      安卓

      adb -s $DEVICE_ID shell am start \
        -n $ANDROID_PACKAGE/$ANDROID_ACTIVITY \
        -ez [arg name] [value] \
        -ez [arg name2] [value 2] \
        ...
      

      iOS

      $FLUTTER_HOME/bin/cache/artifacts/ios-deploy/ios-deploy --id $DEVICE_ID \
        --bundle build/ios/iphoneos/Runner.app \
        --debug \
        --args [arg name] [arg value] [arg name2] [arg value2] ...
      

      请务必使用 Flutter 缓存工件中托管的 ios-deploy 版本。他们肯定对该工具与您可以通过 Homebrew 安装的标准工具进行了一些调整,因为我只有在使用 Flutter 的内部版本时才能正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-26
        • 2018-09-02
        • 1970-01-01
        • 2021-08-30
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        相关资源
        最近更新 更多