Как загрузить активы JSON в приложение Flutter

как загрузить актив JSON в мое приложение Flutter?

мой pubspec.yaml файл имеет следующее:

  assets:
    - assets/data.json

Я продолжаю застрять, пытаясь загрузить данные. Я пытался!--4-->

final json = JSON.decode(
    DefaultAssetBundle.of(context).loadString("assets/data.json")
);

но я получаю ошибку

тип аргумента "Future" не может быть назначен типу параметра "String".

спасибо!

2 ответов


@Александр Боде является правильным, но не дает много контекста о том, что происходит.

когда вы звоните loadString, это фактически асинхронный вызов метода. Вы можете сказать, потому что он возвращает Future<value> а не просто value. Это означает, что он не сразу имеет результат строки, но будет в какой-то момент в будущем.

есть два основных способа борьбы с asynchronicity в дартс; в первую очередь, чтобы использовать async и await, второе - использовать фьючерсы напрямую. Вижу руководство dart по асинхронному программированию.

если вы используете future.then непосредственно, вы можете сделать это из нормальной функции (т. е. из initState и т. д.). Вы просто указываете обратный вызов и вызов, что делать с результатом.

void printDailyNewsDigest() {
  final future = gatherNewsReports();
  future.then((news) => print(news));
}

если вы хотите использовать await как показал @Alexandre, вам нужно отметить функцию, которую вы используете, из as async, т. е.:

Future<Void> printDailyNewsDigest() async {
  String news = await gatherNewsReports();
  print(news);
}

если вы переопределяете функцию (т. е. initState), вам также необходимо убедиться, что вы не изменяете возвращаемое значение. Это должно быть поймано печатанием dart 2 большую часть времени, но void -> Future, похоже, нет.

последнее, что нужно отметить-если вы используете результат данных для создания виджетов, вы, вероятно, захотите посмотреть на использование FutureBuilder.


попробуйте :

String data = await DefaultAssetBundle.of(context).loadString("assets/data.json");
final jsonResult = json.decode(data);