我有一个要求,即在打开页面时进行 API 调用,并使用 API 调用的结果来填充小部件。我必须满足以下情况,例如在进行调用时,显示加载器,如果发生错误,显示一个小部件,如果调用成功,则允许用户重新加载页面,该页面再次调用该方法,使用结果填充小部件。这看起来是 FutureBuilder 的完美用例,但是,如果调用失败,将无法重新加载,因为 FutureBuilder 只执行一次。另一种方法是使用 StreamBuilder,我只需将错误或响应添加到流中,这允许我在调用失败时重新加载页面。streambuidler 方法工作正常。
最初,我尝试通过在 initstate 方法中进行异步 API 调用来使用 ScopedModel 方法,但是,正如预期的那样,api 调用需要一些时间,并且会调用小部件 Build 方法,因此在 api 调用完成之前构建页面并且完成后,即使我调用 notifylisteners() ,小部件树也不会使用 API 调用中的数据重建。有没有办法使用 ScopedModel 方法来完成这项工作?
DashboardService.dart
Future<string> getDashboardState() async{
try{
var response = await client.get('/getdashboardstate');
return response;
}catch(error){
return error;
}
}
DashboardModel.dart
Future<BaseDataResponse<MambuLoan>> getDashboardState() async {
try {
setState(ViewState.Busy);
var info = await _dashboardService.getDashboardState();
if (info.isSuccessful) {
return info;
} else {
setState(ViewState.Error);
return info;
}
} catch (error) {
setState(ViewState.Error);
return error;
}
}
DashboardView.dart
@override
void initState() {
// TODO: implement initState
super.initState();
getDashboard() // result of this set some data in the scopedmodel
}
Future<String> getDashboard() async{
var response = await dashboardModel.getDashboardState();
return response;
}
Widget Build(BuildContext context){
//gets data in scoped model to build widget
return Container() //actual widget here
}
更新
我以错误的方式接近这个。我最终不需要一个有状态的小部件,而是一个无状态的小部件,在返回一个小部件之前,我在 build 方法中调用了我的 Future。