在 Flutter 中使用多个配置文件

Using Multiple Configuration Files in Flutter

现在我正在使用它来加载我的应用程序配置,

await GlobalConfiguration().loadFromAsset("app_settings");
...
GlobalConfiguration().getString("app-setting-1");
GlobalConfiguration().getString("app-setting-2");
...

到目前为止效果很好。

但是现在我的配置文件有点大了。 我想把配置文件拆分成多个部分。

例如:

app_settings_general
app_settings_reports
app_settings_payments

这些文件中的每一个都将保存应用程序不同方面的参数。

这样可以更轻松地管理参数, 以及对一个配置文件进行替换或更改,而无需打开或关心其他配置文件。

我举例说明了应用程序的不同方面, 支付模块配置 报告配置 订购模块配置 等等

我查看了不同的页面,但都在谈论针对不同的环境使用不同的配置文件,而不是在同一个应用程序中使用多个配置文件。

如果您确定密钥在所有配置文件中都是唯一的,那么您可以使用

await GlobalConfiguration().loadFromAsset("app_settings_general");
await GlobalConfiguration().loadFromAsset("app_settings_report");

这会将两个文件中的所有配置仅加载到单个变量。

否则:(如果文件有重复键)

我们可以编写自己的助手类。您可以参考以下示例。

import 'dart:convert';

import 'package:flutter/services.dart';

class AppConfiguration {
  AppConfiguration._internal();

  static final _globConfig = "globConfig";

  static final _singleton = AppConfiguration._internal();

  factory AppConfiguration() {
    return _singleton;
  }

  final _configs = Map<String, dynamic>();

  Future<AppConfiguration> loadConfigs(String name,
      {String category}) async {
    final configJsonString =
    await rootBundle.loadString("assets/configs/$name");

    Map<String, dynamic> configJson = json.decode(configJsonString);

    if (category == null || category.isEmpty) category = _globConfig;

    if (_configs[category] == null) _configs[category] = Map<String, dynamic>();

    _configs[category].addAll(configJson);

    return _singleton;
  }

  T getConfig<T>(String key, {String category}) {
    if (category == null || category.isEmpty) category = _globConfig;
    return _configs[category][key] as T;
  }
}

用法:

  1. 将所有 json 配置文件放入“assets/configs/”文件夹
  2. pubspec.yaml
  3. 中指定配置文件夹
flutter:
 assets:
  - assets/configs/
  1. 在应用程序启动时加载配置
void main() async{
  await AppConfiguration().loadConfigs("app_settings_general", category: "general");
  await AppConfiguration().loadConfigs("app_settings_report", category: "report");
  runApp(MyApp());
}
  1. 访问应用内的配置值
AppConfiguration().getConfig("key1", category: "general");
AppConfiguration().getConfig<String>("key2", category: "report");