Использование Futures для загрузки config.json во Flutter - PullRequest
0 голосов
/ 28 апреля 2018

Будучи новичком в Dart / Flutter, я использую этот фрагмент, чтобы попытаться загрузить файл config.json, который я сохранил в своей папке активов. При попытке прочитать этот файл я использую модели на языке Dart Документация по фьючерсам и документы Flutter при чтении локальных текстовых файлов :

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';

Future<List> loadAsset() async {
  String raw = await rootBundle.loadString('assets/config.json');
  List configData = json.decode(raw);
  return configData;
}

Затем внутри своего класса я пытаюсь загрузить конфигурацию в список, например:

Future<List> configData = loadAsset();
print(configData.toString());
// prints out: Instance of 'Future<List<dynamic>>'

Результат всего этого, кажется, работает. Тем не менее я не могу найти способ использовать данные, которые я загрузил. Любые попытки получить доступ к элементам в Списке, например, configData[0] приводит к ошибке:

The following _CompileTimeError was thrown building 
HomePage(dirty, state: HomePageState#b1af8):
'package:myapp/pages/home_page.dart': error: 
line 64 pos 19: lib/pages/home_page.dart:64:19:
Error: The method '[]' isn't defined for the class 
'dart.async::Future<dart.core::List<dynamic>>'.
Try correcting the name to the name of an existing method, 
or defining a method named '[]'.

Я хотел бы преобразовать configData Future в обычный объект, который я могу читать и передавать по своему приложению. Я могу сделать что-то очень похожее, и заставить его работать внутри метода сборки виджета, используя FutureBuilder и DefaultAssetBundle, таким образом ...

DefaultAssetBundle
.of(context)
.loadString('assets/config.json')

... но я не хочу перегружать данные во всех виджетах, которые в них нуждаются. Я хотел бы загрузить внутри отдельный пакет Dart и сделать его доступным в качестве глобальной конфигурации для всего моего приложения. Любые указатели будут оценены.


Я попробовал предложение Реми Русселе:

List configData = await loadAsset();
print(configData[0]);

В этом случае я получаю ошибку компилятора:

compiler message: lib/pages/home_page.dart:55:21: Error: Getter not found: 'await'.
compiler message:     List configData = await loadAsset();
compiler message:                       ^^^^^

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы можете использовать только асинхронные методы await INSIDE.

Если вы хотите использовать свои активы во всем приложении, вы хотите загрузить актив в основном методе, подобном следующему.

void main() async {
  StorageUtils.localStorage = await SharedPreferences.getInstance();
}

Теперь вы можете использовать localStorage синхронно во всем приложении, и вам не нужно иметь дело с другими асинхронными вызовами или загружать его снова.

Другой пример, тот же принцип.

0 голосов
/ 28 апреля 2018

Вы не можете сделать configData[0], так как configData это не List, а Future.

Вместо этого дождитесь будущего, чтобы получить доступ к List внутри

List configData = await loadAsset();
print(configData[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...