Flutter 启动前读取文件

Eph*_*rom 6 json file dart flutter

我正在尝试在应用程序启动时加载配置 json 文件,因此在加载应用程序之前我可以访问配置。

我的设置:

  • ios
  • 安卓
    • main.dart
  • 数据
    • 配置文件

我在 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 的配置,以便我可以访问应用程序中任何地方的配置数据。

知道我做错了什么或如何实现吗?

Eph*_*rom 4

++++ 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)