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

后端 未结 9 1613
清歌不尽
清歌不尽 2020-12-01 00:14

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 easil

9条回答
  •  栀梦
    栀梦 (楼主)
    2020-12-01 00:51

    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.

提交回复
热议问题