在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中指定配置文件夹
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");