Как загрузить активы 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);