Aet*_*her 8 future dart flutter flutter-dependencies
我正在使用一个名为search_widget. 此小部件的数据参数采用列表。但是当我sqlite用于获取数据时,我有它的Future<List>形式。有什么办法可以转换Future<List>为List?或者任何其他方式来让这个工作。
List list = await _fetchList();
Run Code Online (Sandbox Code Playgroud)
假设_fetchList()是这样的:
Future<List> _fetchList() {...}
Run Code Online (Sandbox Code Playgroud)
使用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
我希望这会有所帮助,如有任何疑问,请发表评论。
借用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,你可以查看这篇文章以获取该问题的详细解释。