[英]flutter Why doesn't async and await work?
_getstockList
_getstockList( List<dynamic> nlist) async {
Map<String, dynamic> userdocdata;
var userdata = await firestore.collection('users').doc('NVPjZEAZneKblrubGZSW').get();
userdocdata = userdata.data() as Map<String, dynamic>;
nlist = userdocdata['favorite'];
}
主要代碼
Widget build(BuildContext context) {
List<dynamic> list = [];
List<Map<String, dynamic>> stockcardlist = [];
_getstockList(list);
print(list); // output
_getstockInfo(list, stockcardlist);
~~~
}
_getstockInfo
_getstockInfo(List<dynamic> nlist, List<Map<String,dynamic>> stockcardlist){
print(nlist.length); // output
}
期望的結果
print(list)
print(nlist.length)
有效值
但
結果print(list)
= []
print(nlist.length)
= 0
請幫助我使用 Future、sync、unawait 但我無法解決
看起來_getStockList
沒有返回任何內容。 當你通過它時,原來的 object 不受影響。 你可以嘗試解決這個問題:
Future<List<dynamic>> _getstockList() async {
Map<String, dynamic> userdocdata;
var userdata = await firestore.collection('users').doc('NVPjZEAZneKblrubGZSW').get();
userdocdata = userdata.data() as Map<String, dynamic>;
List<dynamic> nlist = userdocdata['favorite'];
return nlist;
}
現在你需要撥打這個 function 來填寫列表
Widget build(BuildContext context) {
List<Map<String, dynamic>> stockcardlist = [];
List<dynamic> list = await _getstockList(); // DOES NOT WORK!
print(list);
_getstockInfo(list, stockcardlist);
...
}
但是,這不起作用,因為您不允許在build
中使用await
,這不是異步的。 為了解決這個問題,您可以使用FutureBuilder
: https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
Widget build(BuildContext context) {
return FutureBuilder<List<dynamic>>(
future: _getstockList(),
builder: (BuildContext context, AsyncSnapshot<List<dynamic>> snapshot) {
List<dynamic> list = snapshot.data ?? [];
print(list);
return MyAwesomeScreenWithAList(list);
}
);
}
現在,如果您想在第二個異步中使用第一個異步 function 的結果,最簡單的方法可能是使用兩個嵌套的FutureBuilder
,但並不理想。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.