我正在尝试在应用启动时加载配置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 {
...
}
但是收到一个异常:FileSystemException:无法打开文件,路径='data / config1.json'(操作系统错误:无此类文件或目录,errno = 2)
之后,我想从json中以配置单例设置配置,这样我就可以在应用程序中的任何位置访问配置数据。
有什么主意我在做错什么或如何实现?
答案 0 :(得分:1)
您应该将其用作浮动资产,看看{{3}}。
答案 1 :(得分:0)
这非常简单,只需使用异步方法,并在runApp之前设置“等待”即可。因此,很容易从资产中加载配置文件,并在应用启动之前将其准备好。
IFormatProvider
我为这个问题写了一个简单的flutter程序包。检查一下您是否有同样的情况。 https://github.com/Ephenodrom/Flutter-Global-Config
Future<String> loadFromAsset(String name) async {
String content = await rootBundle.loadString("assets/cfg/$name.json");
return content;
}
然后我可以在任何需要的地方使用该配置。
导入'package:flutter / material.dart'; 导入'package:global_configuration / global_configuration.dart';
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 {
...
}
答案 2 :(得分:0)
根据环境,您可以使用Flutter Global Configuration package从文件加载配置。
示例代码
import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';
import 'AppSettings.config.dart';
import 'DevSettings.config.dart';
void main() async {
GlobalConfiguration().loadFromMap(appSettings).loadFromMap(devSettings);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp() {
// Access configuration at constructor
GlobalConfiguration cfg = new GlobalConfiguration();
print("Key1 has value ${cfg.getString("key1")}");
print("Key2 has value ${GlobalConfiguration().getString("key2")}");
print("Key5 has value ${cfg.getString("key5")}, this should be null!");
}
@override
Widget build(BuildContext context) {
// Access configuration at build method
GlobalConfiguration cfg = new GlobalConfiguration();
print("Key3 has value ${cfg.getString("key3")}");
return MaterialApp(
title: 'Welcome to Flutter',
home: Scaffold(
appBar: AppBar(
title: Text('Welcome to Flutter'),
),
body: Center(
child: Text('Hello World'),
),
),
);
}
}