asynchronous - Flutter/Dart - 调用一个未来的函数...但只需要返回一个字符串
问题描述
我有一个异步函数正在调用 Firestore 以获取数据值。我在上一篇文章中得到了很多帮助……学到了很多……并希望从一个更清晰的问题重新开始。所以我有以下功能
Future<String> getSetList () async {
DocumentReference set01DocRef = Firestore.instance.collection('sets').document('SET01');
var snapshot = await set01DocRef.get();
songList = snapshot['songs']; //works, get expected text value from FS
return songList;
}
此函数逻辑有效...我可以将 songList var(字符串 var)打印()到控制台,我可以看到 Firestore 中的值。当我尝试调用该函数时:
@override
Widget build(BuildContext context) {
var setList = getSetList();
print('In widget: ' + setList.toString()); //shows as instance of Future<String>
//List<String> items = setList.split('|');
List<String> items = ['Red','White','Blue'];
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
该 setList 变量不是字符串。当我打印它 [print(setList.toString()] 时,它显示为 Future String 的一个实例。
我尝试使用:var setList = await getSetList();
但在等待时显示错误。
任何想法表示赞赏。
解决方案
什么时候需要给未来打电话?
您始终可以创建一个 tmp 变量并尝试加载它。您不能将期货随机放入构建过程中。如果视图已更改,您需要获取数据然后调用 setState 来通知小部件。
String _setList = null;
//initState called when the widget is mounted.
void initState() {
super.initState();
if(_setList == null){
getSetList().then(
(String s) => setState(() {_setList = s;})
);
}
}
@override
Widget build(BuildContext context) {
String setList = _setList;
print('In widget: ' + setList.toString()); //shows as instance of Future<String>
if(setList != null){
//List<String> items = setList.split('|');
List<String> items = ['Red','White','Blue'];
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
} else { return const CircularProgressIndicator(); }
//Create a progress circle.
我希望我的设置状态没有任何语法错误。
https://docs.flutter.io/flutter/widgets/State/setState.html
https://docs.flutter.io/flutter/widgets/State/initState.html
推荐阅读
- react-native - 如何使用 react-native-paper 在 List.Accordion 和 List.Item 中显示所有标题和描述
- javascript - Toggle 使用一个代码在多个 div 上阅读更多和阅读更少
- javascript - 如何为每个具有相同结构的 div 获取图像 src?
- python - 如何在熊猫的不同位置绘制图表?
- c# - 如何将类库分成多个程序集(* .dll)?
- javascript - Angular 项目中 angular.json 中的样式和 stylePreprocessorOptions 有什么区别
- angular - 英雄在使用 .subscribe 方法的服务内部绑定了什么?
- python-3.x - 使用 Python 从注册表中读取“MountedDevices”
- c++ - 如何在 Windows 上构建 paho mqtt c++
- electron - 改进跨平台 Electron 应用程序的构建时间