【问题标题】:How to convert Future<List> to List in flutter?如何在颤动中将 Future<List> 转换为 List?
【发布时间】:2020-04-16 17:37:14
【问题描述】:

我正在使用一个名为 search_widget 的颤振插件。 此小部件的 data 参数采用一个列表。但是当我使用sqlite 获取数据时,我将它以Future&lt;List&gt; 的形式提供。 有什么办法可以将Future&lt;List&gt; 转换为List? 或任何其他方式来使其正常工作。

【问题讨论】:

    标签: flutter dart future flutter-dependencies


    【解决方案1】:
    List list = await _fetchList();
    

    假设_fetchList() 类似于:

    Future<List> _fetchList() {...}
    

    【讨论】:

      【解决方案2】:

      假设这是你的返回函数 dataList() 这是未来:

       List yourlist = new List();
         dataList().then((resultat){
                setState(() => yourlist.add(resultat); 
              });
      

      【讨论】:

        【解决方案3】:

        借用search_widget 的示例,您需要在这样的小部件中使用dataList

        SearchWidget<LeaderBoard>(
           dataList: list,
           textFieldBuilder: (TextEditingController controller, FocusNode focusNode) {
             return MyTextField(controller, focusNode);
           },
         )
        

        当然,您可以将Future&lt;List&gt; 转换为List,就像其他答案所建议的那样。但是您不会能够做到 dataList: await _sqliteCall();,因为 build 方法被设计为纯粹和同步的。

        当 Future 完成时,您将不得不返回进度指示器之类的东西。为此,您可以使用FutureBuilder

        FutureBuilder<List<Leaderboard>>(
          future: _sqliteCall(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return SearchWidget<LeaderBoard>(
                dataList: snapshot.data,
                textFieldBuilder: (TextEditingController controller, FocusNode focusNode) {
                  return MyTextField(controller, focusNode);
                },
              )
            }
            return CircularProgressIndicator();
          }
        ),
        

        当然这也可以通过StatefulWidget来完成,你可以查看this article for a detailed explanation of the issue

        【讨论】:

          【解决方案4】:

          使用 await 关键字将等待 Future 完成,一旦你的 Future 被执行,它的结果就会返回给你。

          import 'dart:async';
          
          void main() async {
            Future<List> _futureOfList = _getList();
            List list = await _futureOfList ;
            print(list); // will print [1, 2, 3, 4] on console.
          }
          
          Future<List>  _getList(){
            return Future.value([1,2,3,4]);
          }
          

          为此,您调用的方法应该是async

          希望对你有帮助,如有疑问请评论。

          【讨论】:

            【解决方案5】:

            这就是我解决问题的方法......

            初始版本:

              @override
              List<Product> getAll() {
                List<Product> _listProducts;
                Future<List<Product>> listFuture;
                listFuture = _repo.getAll();
                listFuture.then((value) {
                  if (value != null) value.forEach((item) => _listProducts.add(item));
                });
                return _listProducts == null ? [] : _listProducts;
              }
            

            清理/最终版本:

              @override
              List<Product> getAll() {
                List<Product> _listProducts;
                _repo.getAll().then((value) {
                  if (value != null) value.forEach((item) => _listProducts.add(item));
                });
                return _listProducts == null ? [] : _listProducts;
              }
            

            【讨论】:

              【解决方案6】:
               List<Future<dynamic>> _selectedItems = List<Future<dynamic>>();
                  List<dynamic> listofimg = [];
                                                  _selectedItems.forEach((element) {
                                                    element.then((value) => listofimg.add(value));
                                                  });
              

              【讨论】:

              • 欢迎来到 StackOverflow。虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
              【解决方案7】:

              apiservice 类型的未来返回(未来列表)。我们使用关键字 (then),然后使用未来类型 store 将结果作为列表进行 var 结果。

              您应该在 {} 上调用 value,如下所示:

              onPressed: () {
               _apiService.getProductList().then((result) {
                  print(result);
                  print("kkkkkkkk:"+result.length.toString());
                  for   (var item in result){
                  _dsSanpham.add(item);
              
                  }
                  Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => nhaphangle(
                          username: username, dshangle: dshangle, dssanpham: _dsSanpham)),);
              });
              
              

              【讨论】:

                猜你喜欢
                • 2020-06-14
                • 2020-10-09
                • 2021-09-14
                • 2020-07-25
                • 2020-09-15
                • 2021-07-07
                • 2017-11-02
                • 1970-01-01
                • 2018-03-21
                相关资源
                最近更新 更多