flutter - 如何在 Flutter 中获取异步值
问题描述
我有这个函数可以从中检索数据firestore
并返回一个列表。我从另一个函数调用这个函数。
检索数据并返回列表的函数:
Future<List> getNewsOnSearchBar() async{
final String _collection = 'news';
final Firestore _fireStore = Firestore.instance;
var newsList = [];
print("1");
Future<QuerySnapshot> getData() async {
print("2");
return await _fireStore.collection(_collection).getDocuments();
}
QuerySnapshot val = await getData();
if (val.documents.length > 0) {
print("3");
for (int i = 0; i < val.documents.length; i++) {
newsList.add(val.documents[i].data["headline"]);
}
} else {
print("Not Found");
}
print("4");
return newsList.toList();
}
我从另一个返回如下getNewsOnSearchBar()
的函数调用这个函数:Widget
Widget _showSearchBar(BuildContext context) {
var list = [];
getNewsOnSearchBar().then((value){
print(value); //this will print successfully
list = value; //but this assign doesn't work
});
print(list); //prints an empty list
return GFSearchBar(
// overlaySearchListHeight: 160.0,
searchList: list, //empty
searchQueryBuilder: (query, list) {
return list
.where((item) => item.toLowerCase().contains(query.toLowerCase()))
.toList();
},
overlaySearchListItemBuilder: (item) {
return Container(
padding: const EdgeInsets.all(3),
child: Text(
item,
style: const TextStyle(fontSize: 18),
),
);
},
onItemSelected: (item) {},
);
}
有人能帮助我吗?
解决方案
您Future
以错误的方式使用,当您构建依赖于 a 值的小部件时Future
,您需要使用FutureBuilder
,
因此,例如,您的_showSearchBar
方法(我假设您在内部调用build
以在屏幕上显示某些内容)将变为:
Widget _showSearchBar(BuildContext context) {
return FutureBuilder(
future: getNewsOnSearchBar(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
if (snapshot.data != null) {
return GFSearchBar(
// overlaySearchListHeight: 160.0,
searchList: list, //empty
searchQueryBuilder: (query, list) {
return list
.where((item) => item.toLowerCase().contains(query.toLowerCase()))
.toList();
},
overlaySearchListItemBuilder: (item) {
return Container(
padding: const EdgeInsets.all(3),
child: Text(
item,
style: const TextStyle(fontSize: 18),
),
);
},
onItemSelected: (item) {},
);
} else {
return CircularProgressIndicator();
}
}
}
);
}
在此处了解有关Future
s 的更多信息async/await
:
推荐阅读
- azure - 逻辑应用程序 - 在 HTML 表中注入 HTML 标记
- microsoft-graph-api - 如何联系 MS Graph 的技术支持?
- regex - 如何在scala中应用正则表达式来匹配以精确给定单词开头的字符串?
- nginx - 在 GCP GKE 上使用 Nginx Ingress 处理 CONNECT 请求
- sql - 重复使用相同查询时的最佳实践
- css - 为什么一个网页在我的笔记本电脑上看起来离线响应,而当我使用 Filezilla 上传它时它不再响应?
- javascript - 获取在 onpopstate 事件中弹出的历史记录
- azure - 如何在 Azure 中授权池?
- python - 如何防止 TypeError:只有大小为 1 的数组可以转换为 Python 标量的发生
- apache-spark - 如何在火花数据框中反转和组合字符串列?