如何将JSON资产加载到Flutter应用程序中?
我的pubspec.yaml文件具有以下内容:
pubspec.yaml
assets: - assets/data.json
我一直无法尝试加载数据。我试过了
final json = JSON.decode( DefaultAssetBundle.of(context).loadString("assets/data.json") );
但是我得到了错误
无法将参数类型’Future ‘分配给参数类型’String’。
谢谢!
@Alexandre Beaudet的回答是正确的,但没有给出很多有关正在发生的情况的背景信息。
在调用时loadString,它实际上是一个异步方法调用。您可以知道,因为它返回的是一个Future<value>而不是一个value。这意味着它不会立即得到String的结果,但是会在将来的某个时候出现。
loadString
Future<value>
value
在Dart中,有两种处理异步性的主要方法:第一个是使用async和await,第二个是直接使用期货。请参阅有关异步编程的飞镖指南。
async
await
如果future.then直接使用,则可以通过常规函数(即initState等)来实现。您只需指定回调,然后在回调中处理结果。
future.then
void printDailyNewsDigest() { final future = gatherNewsReports(); future.then((news) => print(news)); }
如果要使用await@Alexandre所示的方法,则需要将使用它的函数从标记为async,即:
Future<Void> printDailyNewsDigest() async { String news = await gatherNewsReports(); print(news); }
如果覆盖一个函数(即initState),则还需要确保不更改返回值。多数情况下,这应该会被dart 2的输入捕获,但是void-> Future似乎不是。
最后要注意的一件事- 如果您正在使用数据结果来构建窗口小部件,则可能需要考虑使用FutureBuilder。