Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I build different versions of my Flutter app for qa/dev/prod?

Tags:

flutter

dart

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?

like image 460
Seth Ladd Avatar asked Nov 22 '17 15:11

Seth Ladd


People also ask

Which software can be used to build a Flutter app?

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.


1 Answers

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()); } 
  • import 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.

like image 179
Jacob Phillips Avatar answered Oct 07 '22 22:10

Jacob Phillips