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