我正在构建一个Flutter应用程序,我有不同环境(QA,dev,prod等)的不同值的变量。什么是组织我的应用程序的好方法,以便我可以轻松地为QA,开发,生产和其他环境构建一个?
答案 0 :(得分:17)
一种方法:在项目的main_<environment>.dart
目录中创建不同的lib/
文件。
每个main_<environment>.dart
包含特定于环境的配置/值(例如,不同的数据库名称等)。然后,每个main_<environment>.dart
导入实际的应用程序库并运行应用程序,传入环境的值/配置。
然后,选择要构建的.dart
个文件:flutter run -t lib/main_debug.dart
答案 1 :(得分:12)
在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);
}
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());
}
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());
}
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"
}
]
}
我本来打算使用传递给Dart的main
函数的命令行参数,但是我不认为args当前可以通过flutter run
或flutter build
在命令行中传递,尽管VS Code和Android Studio都支持将args传递给main
。还将seems的构建风味作为main
的命令行arg不合适,因为可以在构建过程之后 传递args。
答案 2 :(得分:7)
现在可以使用以下方式获取发布和调试模式
const bool isProduction = bool.fromEnvironment('dart.vm.product');
因为这是一个常量,所以可以与摇树一起使用。
像这样的代码
if(isProduction) {
// branch 1
} else {
// branch 2
}
根据isProduction
答案 3 :(得分:4)
从Flutter 1.17开始,您可以使用--dart-define
使用不同的编译时间变量来构建您的应用程序。它适用于Dart和本机层。在dart中,您可以使用String.fromEnvironment
获得这些值。这样,您将无需拥有大量入口或入口点即可公开您的环境凭据
答案 4 :(得分:1)
更干净的方法是通过 Build Flavors 。
举个简单的例子,如果您想为“开发”版本的应用使用不同的应用ID,则可以在gradle文件中使用它:
flavorDimensions "version"
productFlavors {
dev {
applicationIdSuffix ".dev"
versionNameSuffix "-dev"
}
}
详细了解gradle构建变体配置here。
现在您可以在命令行中使用此构建变体运行
flutter run --flavor dev
如果您使用的是Android Studio,也可以在“运行”配置中设置构建变体:
在此blog上了解有关iOS配置的更多信息。以及有关build flavours的正式文件。
答案 5 :(得分:1)
socket.join()
并使用以下const值:
import 'package:flutter/foundation.dart';
答案 6 :(得分:0)
只需您可以实现构建变体。
在android中:
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.release
}
debug{
applicationIdSuffix ".dev"
signingConfig signingConfigs.debug
}
qa{
applicationIdSuffix ".qa"
signingConfig signingConfigs.qa
}
}
在iOS中:
通过选择project-&gt; runner-&gt;添加配置配置添加一个
答案 7 :(得分:0)
其他信息:
我遇到了同样的问题,并使用了塞思·拉德(Seth Ladd)建议的解决方案。因此,我还需要为每个应用程序版本(dev / prod)使用不同的配置,并且我不想在main_dev.dart或main_prod.dart文件中写入配置。
我写了一个简单的flutter程序包,处理单独的配置文件并在应用程序启动时加载它们。然后可以在应用程序的每一行代码中使用该配置。
https://github.com/Ephenodrom/Flutter-Global-Config
如何使用它:
在assets / cfg / $ file.json下创建一个json文件
将资产/ cfg添加到您的pubspec.yaml
在应用启动时加载不同的配置文件:
import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';
void main() async{
await GlobalConfiguration().loadFromAsset("app_settings");
await GlobalConfiguration().loadFromAsset("env_dev_settings");
runApp(MyApp());
}
class MyApp extends StatelessWidget {
...
}
使用应用程序中的配置:
import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';
class CustomWidget extends StatelessWidget {
CustomWiget(){
// Access the config in the constructor
print(GlobalConfiguration().getString("key1"); // prints value1
}
@override
Widget build(BuildContext context) {
// Access the config in the build method
return new Text(GlobalConfiguration().getString("key2"));
}
}
答案 8 :(得分:0)
在项目app_environment.dart
的根目录下创建一个文件。使用kReleaseMode
程序包中的foundation.dart
变量检查生产模式。
import 'package:flutter/foundation.dart';
class AppEnvironment {
String getApiURL() {
if (kReleaseMode) {
return 'PROD_API_URL';
} else {
return 'STAGING_API_URL';
}
}
}