启动前颤动读取文件

时间:2018-11-25 15:47:22

标签: json file dart flutter

我正在尝试在应用启动时加载配置json文件,所以我有权限 加载应用程序之前,先进行配置。

我的设置:

  • ios
  • android
  • lib
    • 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中以配置单例设置配置,这样我就可以在应用程序中的任何位置访问配置数据。

有什么主意我在做错什么或如何实现?

3 个答案:

答案 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'),
        ),
      ),
    );
  }
}