如何在Flutter中将Future<List>转换为List?

19
我正在使用一个名为 search_widget 的 Flutter 插件。该插件的数据参数需要一个列表。但是,由于我使用 sqlite 来获取数据,因此我的数据以 Future<List> 的形式存在。
有没有办法将 Future<List> 转换为 List?或者有其他方法可以使它正常工作。
8个回答

21

使用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
希望这可以帮到您,如有任何疑问,请在评论中提出。

16
List list = await _fetchList();

假设 _fetchList() 是这样的函数:

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

4
借鉴自search_widget的示例,您需要在像这样的小部件中使用dataList
SearchWidget<LeaderBoard>(
   dataList: list,
   textFieldBuilder: (TextEditingController controller, FocusNode focusNode) {
     return MyTextField(controller, focusNode);
   },
 )

当然,你可以像其他答案建议的那样将Future<List>转换为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 来完成,您可以查看此文章详细解释该问题


2

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

初始版本:

  @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;
  }

1
 List listItems = [];
        
          getList() async {
          listItems = await Future<List> listofFuture;
          }

    ...   
    
    ElevatedButton(
          onPressed: () {
          setState(() {});},
          child: Text('Update Data'));

1
假设这是您的返回函数dataList(),它是一个Future:
 List yourlist = new List();
   dataList().then((resultat){
          setState(() => yourlist.add(resultat); 
        });

0
 List<Future<dynamic>> _selectedItems = List<Future<dynamic>>();
    List<dynamic> listofimg = [];
                                    _selectedItems.forEach((element) {
                                      element.then((value) => listofimg.add(value));
                                    });

欢迎来到StackOverflow。虽然这段代码可能解决了问题,但附带解释是如何以及为什么解决这个问题的,将有助于提高您的回答质量并可能获得更多赞同票。请记住,您正在为未来的读者回答问题,而不仅仅是当前提问者。请编辑您的答案以添加解释,并指出适用的限制和假设。 - Ruli

-1
未来返回apiservice类型(Future列表)。我们使用关键字(then),然后将未来类型存储到变量结果中作为列表。
您应该按如下方式在{}上调用then的值:
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)),);
});


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接