类别

浮动应用程序中的环境配置

在这篇文章中,我们将审议如何在浮动应用程序中配置开发,分期和生产环境配置。我们将在运行时创建不同的环境配置并加载正确的环境。

环境配置简介

在任何应用程序开发过程中,我们需要创建不同的环境来运行应用程序。

例如,如果您正在针对本地环境开发并在本地计算机上与API服务器连接,则您的API URL需要指向LocalHost。

同样,如果您在作为生产环境副本的暂存环境中测试应用程序,那么您的应用程序需要为暂存端点使用URL。最后,当您想要发布应用程序时,它应该使用生产端点。

浮动应用程序中的环境配置

不仅是API端点,任何应用程序也需要考虑这些环境变量的其他目的。

您可能希望在应用程序中跟踪分析目的的各种事件;但只在生产环境中。您可能需要在生产环境中显示移动广告。或者您可能只想仅在暂存和生产环境中发送错误报告。

那么,我们如何在浮动应用程序中配置开发,暂存和生产环境?

定义应用环境

我们首先定义一个 抽象类 BaseConfig which will hold our app environment variables.

定义BaseConfig环境

 抽象类  BaseConfig {
  String get apiHost;
  bool get useHttps;
  bool get trackEvents;
  bool get reportErrors;
}

The BaseConfig class has various fields:

  • apiHost表示API端点主机服务器
  • useHttps在制作API调用时检查要使用HTTPS
  • trackEvents检查应用程序中的Firebase事件等用户活动
  • reportErrors表示是否在应用程序中报告运行时错误

我们可以在此处使用应用程序中的环境变量和字段。

Next, we need implement the BaseConfig class for each environment.

开发环境配置

开发环境配置可以如下所示:

class DevConfig implements BaseConfig {
  String get apiHost => "localhost";

  bool get reportErrors => false;

  bool get trackEvents => false;

  bool get useHttps => false;
}

暂存环境配置

同样,暂存环境配置可以如下所示:

class StagingConfig implements BaseConfig {
  String get apiHost => "staging.example.com";

  bool get reportErrors => true;

  bool get trackEvents => false;

  bool get useHttps => true;
}

生产环境的配置

最后,生产环境配置:

class ProdConfig implements BaseConfig {
  String get apiHost => "example.com";

  bool get reportErrors => true;

  bool get trackEvents => true;

  bool get useHttps => true;
}

我们现在已在浮动应用程序中定义了用于开发,暂存和生产环境的类。接下来,我们需要确保我们的应用程序正确使用这些环境。

在浮动应用程序中加载环境配置

In order to load proper environment configuration in our Flutter app, we will create a class called Environment which can set configuration dynamically.

class Environment {
  factory Environment() {
    return _singleton;
  }

  Environment._internal();

  static final Environment _singleton = Environment._internal();

  static const String DEV = 'DEV';
  static const String STAGING = 'STAGING';
  static const String PROD = 'PROD';

  BaseConfig config;

  initConfig(String environment) {
    config = _getConfig(environment);
  }

  BaseConfig _getConfig(String environment) {
    switch (environment) {
      case Environment.PROD:
        return ProdConfig();
      case Environment.STAGING:
        return StagingConfig();
      default:
        return DevConfig();
    }
  }
}

Since the Environment class has a singleton implementation, this ensures that the environment configuration doesn’t change through out the application lifecycle.

初始化环境配置

Now, all that’s left to do is initialize the environment configuration in our app. We should do this at the main entry point for the app i.e. inside the main.dart main() function.

void main() {
  const String environment = String.fromEnvironment(
    'ENVIRONMENT',
    defaultValue: Environment.DEV,
  );

  Environment().initConfig(environment);

  runApp(MyApp());
}

We have modified the main method to initialize the app environment during runtime. The main method expects a argument named ENVIRONMENT whose default value is DEV.

因此,默认情况下,如果未指定其他值,则应用程序在开发环境中运行。

在APP中需要时获取环境变量值

初始化环境后,我们可以通过这样做的内容在应用程序内的任何位置使用:

// somewhere inside your app where you are make HTTP call

final String apiHost = Environment().config.apiHost;
final bool useHttps = Environment().config.useHttps;

如果你直到现在一直在关注,我相信你想知道,“œ”一切都看起来很棒,但如何将参数传递给主要方法? œ

好吧,我会把它留给你现在弄清楚♥〜>

只是在开玩笑!

Starting with Flutter 1.17, Flutter supports receiving additional arguments to the main function using the --dart-define keywords.

因此,我们可以使用它来捆绑在扑振中配置开发,分期和生产环境的事情。

在暂存模式下运行应用程序:

 扑  run --dart-define=ENVIRONMENT=STAGING

在生产模式下运行应用程序:

 扑  run --dart-define=ENVIRONMENT=STAGING

或在开发模式下运行它:

 扑  run --dart-define=ENVIRONMENT=STAGING
//or simply
flutter run

You can setup these arguments in your Makefile or also in your CI/CD pipelines as well.

配置Gitlab通过CodeMagic将浮动应用程序部署