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在启动前读取文件的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Flutter Web 读取 .txt 文件

如何在 iOS 中使用 NSKeyedArchiver 将已写入文件系统的 Flutter 中的文件作为字符串读取?

如何在 Flutter 中从 firebase 存储读取和写入文本文件?

如何在 Dart/Flutter 中读取本地图像文件的字节数?

Flutter/Dart:读取文本文件以奇怪的字符为前缀

Flutter:如何在不阻塞 UI 的情况下异步地从资产中读取文件