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

时间:2019-12-26 13:18:50

标签: flutter dart future flutter-dependencies

我正在使用名为search_widget的Flutter插件。 此小部件的data参数带有一个列表。但是,当我使用sqlite来获取数据时,我将其以Future<List>的形式保存。 有什么方法可以将Future<List>转换为List? 或通过其他任何方式使其正常工作。

7 个答案:

答案 0 :(得分:2)

List list = await _fetchList();

假设_fetchList()类似于:

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

答案 1 :(得分:0)

假设这是我们返回的函数dataList(),它是Futur:

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

答案 2 :(得分:0)

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

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

当然,您可以像其他答案一样将Future<List>转换为List。但是您将无法执行dataList: await _sqliteCall();,因为build方法被设计为纯同步的。

“未来”完成时,您将必须返回诸如进度指示器之类的东西。为此,您可以使用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

答案 3 :(得分:0)

使用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

我希望这会有所帮助,如有任何疑问,请发表评论。

答案 4 :(得分:0)

那是我解决问题的方式...

初始版本:

ModelCheckpoint

已清理/最终版本:

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

答案 5 :(得分:0)

Node.js

答案 6 :(得分:0)

您应该在 {} of then 上调用 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)),);
});