我正在開發一個復雜的 Web 應用程式,有時我需要從后端 API 獲取資料。有時,我需要在 Future Builder 中呼叫 2 個未來函式來使用它們的值。但是,它使代碼變得混亂,因為對于每個 FutureBuilder,我需要檢查它是否有資料并回傳小部件。它看起來像這樣。
return FutureBuilder<object>(
future: func1(),
builder:(context, AsyncSnapshot<object> snapshot1){
if(snapshot1.hasData){
return FutureBuilder<object>(
future: func2(),
builder:(context, AsyncSnapshot<object> snapshot2){
if(snapshot2.hasData){
return widget;
}else{
return CircularProgressIndicator();
}
}
),
}else{
return CircularProgressIndicator();
}
}
);
還有其他更簡單的方法嗎?我只能使用一個 FutureBuilder,這樣我就不必每次都回傳小部件,即 (CircularProgressIndicator)。謝謝。
uj5u.com熱心網友回復:
首先像這樣創建結果模型類:
class ResultModel{
final object1 result1;
final object2 result2;
ResultModel({required this.result1, required this.result2});
}
然后你可以future像這樣創建新的:
Future<ResultModel> _newFuture() async {
final results = await Future.wait([func1(), func2()]);
return ResultModel(result1: results[0], result2: results[1]);
}
然后將其傳遞給 single FutureBuilder:
FutureBuilder<ResultModel>(
future: _newFuture(),
builder:(context, AsyncSnapshot<ResultModel> snapshot1){
if(snapshot1.hasData){
return return widget;
}else{
return CircularProgressIndicator();
}
}
)
uj5u.com熱心網友回復:
1/。如果 func1 和 func2 是獨立的,你可以使用它同時呼叫它
Future.wait https://api.flutter.dev/flutter/dart-async/Future/wait.html
2/。如果你的 func2 依賴于 func1。撰寫 1 個自定義函式并在您未來的構建器中使用它:
func1AndFunc2() async {
var result = await func1();
// check result has data
if (result != null) {
return func2();
}
}
uj5u.com熱心網友回復:
正如公認的答案所暗示的那樣,無需使 ResultModel 類復雜化。如果我們需要運行 3 個期貨怎么辦?為 3 創建新模型?還有4?
簡單的解決方案如下。請注意,您可以使用List<dynamic>if 函式回傳不同的型別,并且可以在讀取值時進行相應的轉換。
FutureBuilder<List<dynamic>>(
future: Future.wait([func1(), func2()]),
builder:(context, AsyncSnapshot<List<dynamic>> snapshot1){
if(snapshot1.hasData){
var result1=snapshot1.data[0];
var result1=snapshot1.data[1];
return return widget;
}else{
return CircularProgressIndicator();
}
}
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529316.html
