【问题标题】:Flutter: Build web app with file other than 'lib/main.dart'Flutter:使用“lib/main.dart”以外的文件构建 Web 应用程序
【发布时间】:2021-09-09 04:54:57
【问题描述】:

我在我的 lib 文件夹中使用多个 dart main 文件来传递不同的应用程序配置,具体取决于每个服务器将使用的服务器。

main_dev.dart 示例

void main() async {
  FlavorConfig(
    flavorName: 'test',
    values: {
      'BASE_URL': 'http://$MY_IP:9002/graphql',
      'WS_URL': 'ws://$MY_IP:9002/graphql',
    },
  );

  await runApp(ProviderApp());
}

目前我有main_test.dartmain_live.dart,并且在构建android 应用程序时一切正常。

示例我使用以下命令构建测试应用程序。

flutter build apk --obfuscate --split-debug-info=./build/app/outputs/symbols lib/main_test.dart

注意最后一部分 lib/main_test.dart 我指定了我打算使用的文件,它非常适合构建 android 应用程序。

但我在 web 上尝试过类似的事情,但我收到以下错误,因为在我看来构建 web 应用程序需要 main.dart

目标 dart2js 失败:异常: .dart_tool/flutter_build/11c1feed0a867bb072ab6c7b64967a31/main.dart:8:8: 错误:读取“lib/main.dart”时出错:读取错误 'lib/main.dart'(系统找不到指定的文件。)导入 'package:my_amazing_app/main.dart' 作为入口点; ^ .dart_tool/flutter_build/11c1feed0a867bb072ab6c7b64967a31/main.dart:13:3: 错误:找不到方法:'main'。入口点.main(); ^^^^ 错误: 编译失败。

为 Web 编译 lib\main.dart...
20.3s 异常:无法为 Web 编译应用程序。

如何在 web 命令中也指定我想要的文件?

我尝试了以下但没有成功flutter build web lib/main_test.dart

【问题讨论】:

标签: flutter dart


【解决方案1】:

您可以使用编译时常量,而不是使用不同的入口点。运行flutter build 时,您可以传入--dart-define=foo=bar 以设置编译时常量,然后您可以在代码中使用它:

const foo = String.fromEnvironment('foo');
print(foo);  // prints "bar"

const fooExists = bool.hasEnvironment('foo');
print(fooExists);  // prints "true"

请注意,这是一个const 值,因此编译器仍然可以使用此信息进行摇树。

在您的情况下,假设您有 2 个环境:prodtest,您可以执行以下操作:

// lib/main.dart

void main() {
  const env = String.fromEnvironment('env');
  if (env == 'test') {
    runApp(TestApp());
  } else if (env == 'prod') {
    runApp(ProdApp());
  } else {
    throw 'unknown environment: $env';
  }
}

然后当你构建你的应用程序时,你可以使用:

flutter build web --dart-define=env=prod <other-args>

【讨论】:

  • 谢谢你,它很有用。从 XCode 构建时使用 dart 环境变量的任何选项?
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2021-11-19
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多