如何将JSONassets资源 加载到我的Flatter应用程序中?

我的pubspec.yaml文件包含以下内容:

assets:
    - assets/data.json

我一直在try 加载数据时卡住了.我试过了:

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

但我得到的错误是:

参数类型"Future<字符串>'无法分配给参数类型"String".

推荐答案

@Alexandre Beaudetanswer是正确的,但并没有给出很多关于正在发生的事情的背景.

当您调用loadString时,它实际上是一个异步方法调用.您可以看出来,因为它返回的是Future<value>,而不仅仅是value.这意味着它不会立即产生字符串结果,但会在将来的某个时候产生.

在DART中有两种主要的方法来处理异步性;第一种是使用asyncawait,第二种是直接使用期货.请看dart guide on Asynchronous Programming.

如果您直接使用future.then,则可以从普通函数(即从initState等)执行.您只需指定回调,并在回调中指定如何处理结果.

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.

Flutter相关问答推荐

如何在列表磁贴上添加行

如何从模型列表中生成DropdownButtonFormField?

如何等待抖动S定时器.定期取消?

SingleChildScrollView正在将Container的高度限制为子对象,尽管使用了Expanded Inside Row()

如何创建一个按钮来在Ffltter Webview中转到上一页?

MobX Build_Runner问题:不生成.G文件(Flutter )

Flutter API请求BadState响应

在选项卡栏视图中搜索和筛选不起作用

上传的图像不能在FireBase中预览.S档案类型为空白,摆动

Flutter卡内容未在水平列表视图中居中

我如何在Android 13中通过Flutter应用程序打开文件(不是图像、视频或音频)?

SliverAppbar 呈蓝色

Firestore 使用 Flutter 以奇怪的格式保存数据

如何使用 riverpod_annotation 创建非自动处置提供程序?

graphql_flutter 错误:非抽象类GraphQLWebSocketChannel缺少实现

为什么将 bloc 提供程序放在单独的文件/类中会引发错误?

如何流畅切换画面?

Android: 从 URI 获取音频元数据

无效的 depfile: C:\xxx\xxx\Flutter\project_name\.dart_tool\flutter_build\df4b308df1ee4bce22c56c71751554d1\kernel_snapshot.d 无效

http响应在Flutter 中返回307