我正在构建一个Flutter应用程序,我有不同环境(QA,dev,prod等)的不同值的变量.什么是组织我的应用程序的好方法,以便我可以轻松地为QA,开发,生产和其他环境构建?
Jac*_*ips 19
基于Seth的想法,这是一个设置表示BuildEnvironment命名的全局的示例env.
env.dart
import 'package:meta/meta.dart';
enum BuildFlavor { production, development, staging }
BuildEnvironment get env => _env;
BuildEnvironment _env;
class BuildEnvironment {
/// The backend server.
final String baseUrl;
final BuildFlavor flavor;
BuildEnvironment._init({this.flavor, this.baseUrl});
/// Sets up the top-level [env] getter on the first call only.
static void init({@required flavor, @required baseUrl}) =>
_env ??= BuildEnvironment._init(flavor: flavor, baseUrl: baseUrl);
}
Run Code Online (Sandbox Code Playgroud)
main_dev.dart
import 'package:flutter/material.dart';
import 'env.dart';
import 'app.dart';
void main() {
BuildEnvironment.init(
flavor: BuildFlavor.development, baseUrl: 'http://dev.example.com');
assert(env != null);
runApp(App());
}
Run Code Online (Sandbox Code Playgroud)
main_prod.dart
import 'package:flutter/material.dart';
import 'env.dart';
import 'app.dart';
void main() {
BuildEnvironment.init(
flavor: BuildFlavor.production, baseUrl: 'http://example.com');
assert(env != null);
runApp(App());
}
Run Code Online (Sandbox Code Playgroud)
env.dart以公开env变量.使用该target选项运行并构建应用程序.
flutter run -t lib/main_dev.dart
flutter build -t lib/main_dev.dart
要与VS Code集成,请定义启动配置:
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "development",
"program": "lib/main_dev.dart",
"request": "launch",
"type": "dart"
},
{
"name": "production",
"program": "lib/main_prod.dart",
"request": "launch",
"type": "dart"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我原本打算使用传递给Dart main函数的命令行参数,但我不认为args当前可以在命令行上使用flutter run或传递flutter build,尽管VS Code和Android Studio都支持传递args main.由于args可以在构建过程之后传递,因此它看起来像构造命令行arg main是不合适的.
Set*_*add 18
一种方法:main_<environment>.dart在lib/项目目录中创建不同的文件.
每个main_<environment>.dart包含特定于环境的配置/值(例如不同的数据库名称等).main_<environment>.dart然后每个都导入实际的应用程序库并运行应用程序,传入环境的值/配置.
然后,选择.dart要构建的文件:flutter run -t lib/main_debug.dart
Gün*_*uer 11
现在可以使用以下命令获取发布和调试模式
const bool isProduction = bool.fromEnvironment('dart.vm.product');
Run Code Online (Sandbox Code Playgroud)
因为这是一个常数,所以它可以与摇树一起使用。
所以像
if(isProduction) {
// branch 1
} else {
// branch 2
}
Run Code Online (Sandbox Code Playgroud)
只会将这两个分支之一包含在生产代码中,具体取决于 isProduction
从 Flutter 1.17 开始,您可以使用--dart-define不同的编译时变量来构建您的应用程序。它适用于 Dart 和原生层。例如,在 dart 中,您可以获得这些值String.fromEnvironment。通过这种方式,您将不需要大量或入口点并公开您的环境凭据
这是一篇解释更多的文章 https://link.medium.com/ibuTsWHrk6
更简洁的方法是通过Build Flavors。
举个简单的例子,如果您想为“dev”构建的应用程序使用不同的应用程序 ID,则可以在 gradle 文件中包含以下内容:
flavorDimensions "version"
productFlavors {
dev {
applicationIdSuffix ".dev"
versionNameSuffix "-dev"
}
}
Run Code Online (Sandbox Code Playgroud)
在此处阅读有关 gradle 构建变体配置的更多信息。
现在您可以使用命令行运行此构建变体:
flutter run --flavor dev
Run Code Online (Sandbox Code Playgroud)
如果您使用 Android Studio,您也可以在运行配置中设置构建变体:
在此博客上阅读有关 iOS 配置的更多信息。以及有关构建风格的官方 flutter 文档。
import 'package:flutter/foundation.dart';
Run Code Online (Sandbox Code Playgroud)
并使用以下常量值:
if (kReleaseMode) {
// App is running in release mode.
} else if (kProfileMode) {
// App is running in profile mode.
} else if (kDebugMode) {
// App is running in debug mode.
} else if (kIsWeb) {
// App is running on the web.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4807 次 |
| 最近记录: |