使用Futures在Flutter中加载config.json

时间:2018-04-27 22:30:18

标签: dart flutter

成为Dart / Flutter的新用户我正在使用此代码段尝试加载我存储在资源文件夹中的config.json文件。在尝试阅读此文件时,我使用的是Dart语言Futures documentationFlutter docs on reading local text files中的模型:

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;
}

然后,在我的课程中,我尝试将配置加载到List中,如下所示:

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转换为我可以阅读并传递给我的应用程序的普通对象。我可以做一些非常相似的事情,并使用FutureBuilderDefaultAssetBundle来使其在widget的构建方法中工作...

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

...但我不想在所有需要它的小部件中重新加载数据的开销。我想加载一个单独的Dart包,并将其作为我的所有应用程序的全局配置。任何指针将不胜感激。

我已经尝试过RémiRousselet的建议:

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 :(得分:3)

由于configData[0]不是configData而是List,您无法Future

相反,等待未来有权访问<{1}}内部

List

答案 1 :(得分:1)

您只能使用await INSIDE异步方法。

如果要在整个应用程序中使用资产,则需要使用类似这样的主要方法来加载资产。

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

现在,您可以在整个应用程序中同步使用localStorage,而无需处理另一个异步调用或再次加载它。

不同的示例,相同的原理。