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

Aet*_*her 8 future dart flutter flutter-dependencies

我正在使用一个名为search_widget. 此小部件的数据参数采用列表。但是当我sqlite用于获取数据时,我有它的Future<List>形式。有什么办法可以转换Future<List>为List?或者任何其他方式来让这个工作。

Cop*_*oad 9

List list = await _fetchList();
Run Code Online (Sandbox Code Playgroud)

假设_fetchList()是这样的:

Future<List> _fetchList() {...}
Run Code Online (Sandbox Code Playgroud)


Kal*_*ani 5

使用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]);
}
Run Code Online (Sandbox Code Playgroud)

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

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


fra*_*k06 4

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

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

当然,您可以像其他答案建议的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();
  }
),
Run Code Online (Sandbox Code Playgroud)

当然这也可以用a来完成StatefulWidget,你可以查看这篇文章以获取该问题的详细解释。