Flutter在启动前读取文件
Posted
技术标签:
【中文标题】Flutter在启动前读取文件【英文标题】:Flutter read file before startup 【发布时间】:2019-04-27 09:25:03 【问题描述】:我正在尝试在应用启动时加载配置 json 文件,所以我可以访问 加载应用之前的配置。
我的设置:
ios 安卓 库 main.dart 数据 config1.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 设置配置,这样我就可以在应用程序的任何地方访问配置数据。
知道我做错了什么或如何实现吗?
【问题讨论】:
【参考方案1】:++++ 2019 年 7 月更新 ++++
有一个使用 Flutter 全局配置的新 Flutter 包。
Github:https://github.com/Ephenodrom/EZ-Flutter
EZ Flutter 支持管理可在应用内访问的不同配置文件。 EzRunner 在启动时会加载不同的配置文件。
来自Documentation:
EZ 设置
EzRunner 会自动从 assets 目录加载一个名为 ez_settings.json 的 json 文件。
ez_settings.json 应该只包含引用 EZ 框架的配置。
EzSettingsKeys 定义了可用于 EZ 框架的所有设置。
环境设置
如果 envPath 设置为EzRunner 的run 方法中的参数,它会加载配置并且可以通过EzSettings 访问它 env() 方法。
EzRunner.run(CustomWidget() ,
envPath: "assets/env_dev.json");
环境 .json 文件应包含配置,具体取决于应用运行的当前环境。
应用设置
EzRunner 将从 applicationPath 加载配置,并通过EzSettings 的 app() 方法使其可用。
EzRunner.run(CustomWidget(),
applicationPath: "assets/application.json");
访问设置
可以通过EzSettings 类访问设置。
Map<String, dynamic> ezSettings = EzSettings.ez();
Map<String, dynamic> envSettings = EzSettings.env();
Map<String, dynamic> appSettings = EzSettings.app();
++++ 旧答案 ++++
这简直太简单了......只需使用异步方式并在 runApp 之前设置一个“等待”。因此,很容易从资产中加载配置文件并在应用启动之前准备好它。
Future<String> loadFromAsset(String name) async
String content = await rootBundle.loadString("assets/cfg/$name.json");
return content;
我为这个问题写了一个简单的颤振包。看看你是否有同样的情况。 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
...
然后我可以在任何我想要的地方使用配置。
import 'package:flutter/material.dart'; 导入'package: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"));
【讨论】:
【参考方案2】:你应该将它用作颤振资产,看看this。
【讨论】:
【参考方案3】:您可以根据环境使用 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'),
),
),
);
【讨论】:
我在使用 http 0.13.0 运行全局配置时遇到问题。 pubspec 抛出错误。以上是关于Flutter在启动前读取文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 中使用 NSKeyedArchiver 将已写入文件系统的 Flutter 中的文件作为字符串读取?
如何在 Flutter 中从 firebase 存储读取和写入文本文件?