簡體   English   中英

flutter 為什么異步和等待不起作用?

[英]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 ,這不是異步的。 為了解決這個問題,您可以使用FutureBuilderhttps://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM