Eph*_*rom 6 json file dart flutter
我正在尝试在应用程序启动时加载配置 json 文件,因此在加载应用程序之前我可以访问配置。
我的设置:
我在 main.dart 文件中的代码:
import 'package:flutter/material.dart';
import 'dart:io';
import 'dart:convert';
void main(){
final file = new File('data/config1.json');
String content = file.readAsStringSync(encoding: Encoding.getByName("utf8"));
Map<String,dynamic> config = json.decode(content);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
...
}
Run Code Online (Sandbox Code Playgroud)
但是收到异常:FileSystemException:无法打开文件,路径 = 'data/config1.json'(操作系统错误:没有这样的文件或目录,errno = 2)
之后,我想在配置单例中设置来自 json 的配置,以便我可以访问应用程序中任何地方的配置数据。
知道我做错了什么或如何实现吗?
++++ 2019 年 7 月更新 ++++
有一个新的 Flutter 包使用 Flutter 全局配置。
Github: https: //github.com/Ephenodrom/EZ-Flutter
EZ Flutter 支持管理可在应用程序内部访问的不同配置文件。EzRunner在启动时加载不同的配置文件。
来自文档:
EzRunner自动从 asset 目录加载一个名为 ez_settings.json 的 json 文件。
ez_settings.json 应仅包含引用 EZ 框架的配置。
EzSettingsKeys定义了 EZ Framework 可用的所有设置。
如果envPath在EzRunner的run方法中设置为参数,它将加载配置,并且可以通过EzSettings env()方法访问它。
EzRunner.run(CustomWidget() ,
envPath: "assets/env_dev.json");
Run Code Online (Sandbox Code Playgroud)
环境 .json 文件应包含取决于应用程序运行的当前环境的配置。
EzRunner将从applicationPath加载配置并通过EzSettings的app()方法使其可用。
EzRunner.run(CustomWidget(),
applicationPath: "assets/application.json");
Run Code Online (Sandbox Code Playgroud)
可以通过EzSettings类访问这些设置。
Map<String, dynamic> ezSettings = EzSettings.ez();
Map<String, dynamic> envSettings = EzSettings.env();
Map<String, dynamic> appSettings = EzSettings.app();
Run Code Online (Sandbox Code Playgroud)
++++ 旧答案 ++++
非常简单......只需使用异步方式并在 runApp 之前设置“await”即可。因此,从资产中加载配置文件并在应用程序启动之前准备好是很容易的。
Future<String> loadFromAsset(String name) async {
String content = await rootBundle.loadString("assets/cfg/$name.json");
return content;
}
Run Code Online (Sandbox Code Playgroud)
我为这个问题写了一个简单的 flutter 包。看看你是否也有同样的情况。https://github.com/Ephenodrom/Flutter-Global-Config
import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';
void main() async{
GlobalConfiguration cfg = new GlobalConfiguration();
await cfg.loadFromAsset("app_settings").loadFromAsset("env_dev");
runApp(MyApp());
}
class MyApp extends StatelessWidget {
...
}
Run Code Online (Sandbox Code Playgroud)
然后我可以在任何我想要的地方使用该配置。
导入“包:flutter/material.dart”;导入'包:global_configuration / global_configuration.dart';
class CustomWidget extends StatelessWidget {
CustomWiget(){
// Access the config in the constructor
GlobalConfiguration cfg = new GlobalConfiguration();
print(cfg.getAppConfig("key1"); // prints value1
}
@override
Widget build(BuildContext context) {
// Access the config in the build method
GlobalConfiguration cfg = new GlobalConfiguration();
return new Text(cfg.getAppConfig("key2"));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7128 次 |
| 最近记录: |