I am building a Flutter app, and I have variables with different values for different environments (QA, dev, prod, etc). What's a good way to organize my app so I can easily make a build for QA, dev, prod, and other environments?
You can install Android Studio, IntelliJ IDEA, or Visual Studio Code and install the Flutter and Dart plugins to enable language support and tools for refactoring, running, debugging, and reloading your web app within an editor.
Building on Seth's idea, here's an example that sets up a global representing the BuildEnvironment
named 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
to expose the env
variable.run and build the app using the target
option.
flutter run -t lib/main_dev.dart flutter build -t lib/main_dev.dart
To integrate with VS Code, define launch configurations:
.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" } ] }
I had originally set out to use command line arguments passed to Dart's main
function, but I don't think args can currently be passed on the command line with flutter run
or flutter build
, although VS Code and Android Studio both support passing args to main
. It also seems build flavor as a command line arg to main
is not appropriate since args can be passed after the build process.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With