Флаттер читает файл перед запуском - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь загрузить файл конфигурации json при запуске приложения, поэтому у меня есть доступ к конфигурации до загрузки приложения.

Моя настройка:

  • ios
  • android
  • lib
    • main.dart
  • data
    • 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 в конфигурационном синглтоне, чтобы у меня был доступ к данным конфигурации везде в приложении.

Есть идеи, что я делаю неправильно или как этого добиться?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

++++ Обновление июль 2019 ++++

Существует новый пакет Flutter, который использует глобальную конфигурацию Flutter.

Github: https://github.com/Ephenodrom/EZ-Flutter

EZ Flutter поддерживает управление различными файлами конфигурации, которые могут быть доступны внутри приложения. EzRunner загружает различные файлы конфигурации при запуске.

Из Документации :

Настройки EZ

EzRunner автоматически загружает файл json с именем ez_settings.json из каталога ресурсов.

Файл ez_settings.json должен содержать только конфигурацию, относящуюся к EZ Framework.

EzSettingsKeys определяет все параметры, доступные для EZ Framework.

Параметры среды

Если envPath задано в качестве аргумента в методе run EzRunner , загружает конфигурацию и доступ к нему можно получить с помощью EzSettings env () .

EzRunner.run(CustomWidget() ,
      envPath: "assets/env_dev.json");

Среда.Файл json должен содержать конфигурацию в зависимости от текущей среды, в которой работает приложение.

Настройки приложения

EzRunner загрузит конфигурацию из applicationPath и сделать этодоступно через app () метод EzSettings .

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();

++++ Старый ответ ++++

Это было чертовски просто ... Просто используйте асинхронный способ и установите "ожидание""перед запуском приложения.Поэтому легко загрузить конфигурационный файл из ресурсов и подготовить его до запуска приложения.

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';import '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"));
     }
}
0 голосов
/ 26 ноября 2018

Вы должны использовать его как актив флаттера, посмотрите на this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...