成为Dart / Flutter的新用户我正在使用此代码段尝试加载我存储在资源文件夹中的config.json
文件。在尝试阅读此文件时,我使用的是Dart语言Futures documentation和Flutter 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转换为我可以阅读并传递给我的应用程序的普通对象。我可以做一些非常相似的事情,并使用FutureBuilder
和DefaultAssetBundle
来使其在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: ^^^^^
答案 0 :(得分:3)
由于configData[0]
不是configData
而是List
,您无法Future
。
相反,等待未来有权访问<{1}}内部
List
答案 1 :(得分:1)
您只能使用await INSIDE异步方法。
如果要在整个应用程序中使用资产,则需要使用类似这样的主要方法来加载资产。
void main() async {
StorageUtils.localStorage = await SharedPreferences.getInstance();
}
现在,您可以在整个应用程序中同步使用localStorage,而无需处理另一个异步调用或再次加载它。
不同的示例,相同的原理。