![](/img/trans.png)
[英]How Do I Use RefreshIndicator with a FutureBuilder in Flutter?
[英]How do I prevent Flutter FutureBuilder from firing early?
我正在使用以下 FutureBuilder 來處理從 Firebase 數據庫中獲取“小隊”信息,但未來說它在我可以處理數據庫中的所有數據之前完成:
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _getUserSquads(),
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
} else {
if (_userSquads == null) {...} else {
print(snapshot.connectionState);
return Text(_userSquads.length.toString());
}
}
},
);
...以下兩個功能是我在FutureBuilder完成之前需要完成的功能:
Future<void> _getUserSquads() async {
print('1');
final squadIdsResult = await _userSquadsRef.once();
print('2');
if (squadIdsResult.value == null) {
print('3');
return;
}
print('4');
_userSquadIds = squadIdsResult.value;
print('5');
final test = await _test();
print('6');
}
Future<void> _test() {
print('7');
_userSquadIds.forEach((key, value) async {
print('itter');
final result = await _squadsRef.child(key).once();
_userSquads.add(result.value);
print(result.value);
print(_userSquads);
});
print('8');
print('9');
}
兩個打印語句print(result.value)
和print(_useraSquads)
直到 Future 的連接 state 完成后才會執行:
I/flutter (29217): 2
I/flutter (29217): 4
I/flutter (29217): 5
I/flutter (29217): 7
I/flutter (29217): itter
I/flutter (29217): 8
I/flutter (29217): 9
I/flutter (29217): 6
I/flutter (29217): ConnectionState.done
I/flutter (29217): {squadName: SAFTS}
I/flutter (29217): [{squadName: SAFTS}]
似乎問題出在 _test _test()
function 中,但我嘗試了一百種不同的方法來編寫它,但我不知道如何確保代碼完成從數據庫中的數據獲取在 Future 設置為 done 之前的forEach
塊。
您的 _userSquadIds 的 foreach 正在創建問題。 如果你想讓它異步,你可以使用Future.forEach 。
更改以下代碼。
_userSquadIds.forEach((key, value) async {
print('itter');
final result = await _squadsRef.child(key).once();
_userSquads.add(result.value);
print(result.value);
print(_userSquads);
});
與以下之一。
await Future.forEach(_userSquadIds, (key,value) async {
print('itter');
final result = await _squadsRef.child(key).once();
_userSquads.add(result.value);
print(result.value);
print(_userSquads);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.