我在 main 中使用 async await,因此用戶必須在啟動螢屏中等待才能進入應用程式。
void main() async {
await Firebase.initializeApp();
String? x;
await FirebaseDatabase.instance.ref().child("data").once().then((snapshot) {
Map data = snapshot.snapshot.value as Map;
x = jsonEncode(data);
});
return ChangeNotifierProvider<DataModel>.value(
value: DataModel(data: x),
child: MaterialApp()
);
}
如果有用戶在沒有互聯網連接的情況下進入應用程式,他們將永遠停留在啟影片面上。如果還有網路連接速度較慢的用戶,他們將在初始螢屏上停留更長時間。
因此,無論互聯網連接問題是什么,我都想設定最多 5 秒以等待,如果超過,則跳過該部分并直接進入應用程式。
uj5u.com熱心網友回復:
您可以在類上使用timeout 方法。Future
您可以傳遞一個Duration, 和一個onTimeout回呼,如果超過了持續時間,它將被呼叫。
uj5u.com熱心網友回復:
將您的 Firebase api 呼叫傳遞給一個函式,使該方法回傳未來,
Future<String?> getData() async {
await FirebaseDatabase.instance.ref().child("data").once().then((snapshot) {
Map data = snapshot.snapshot.value as Map;
return jsonEncode(data);
});
}
然后在 main 方法上,使用您創建的方法附加超時
void main() async {
await Firebase.initializeApp();
String? x = await getData().timeout(Duration(seconds: 5), onTimeout: () {
return null };
return ChangeNotifierProvider<DataModel>.value(
value: DataModel(data: x),
child: MaterialApp()
);
}
因此,如果您的 api 花費超過 5 秒的時間,那么它會退出并回傳 null
uj5u.com熱心網友回復:
你可以用戶競爭條件或 Future.timeout
使用 future.any 的競爭條件
final result = await Future.any([
YourFunction(),
Future.delayed(const Duration(seconds: 3))
]);
在上面的代碼中,首先完成的人會給出結果,所以如果你的代碼花費超過 3 秒,那么其他函式將回傳答案
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/443539.html
標籤:扑 镖 异步 firebase-实时数据库 异步等待
