我有一个要求,即在打开页面时进行API调用,并使用API调用的结果填充小部件。我必须照顾一些情况,例如进行呼叫时,显示加载程序,如果发生错误,显示小部件,该部件允许用户重新加载页面,如果调用成功,则再次调用该方法,并使用结果填充小部件。 这对于FutureBuilder来说似乎是一个完美的用例,但是,如果调用失败,则因为FutureBuilder一旦执行,就不会有重新加载的方法。 一种替代方法是使用StreamBuilder,在其中我仅将错误或响应添加到流中,这使我可以在调用失败的情况下重新加载页面。 streambuidler方法很好用。
最初,我尝试通过在initstate方法中进行异步API调用来使用ScopedModel方法,但是,正如预期的那样,api调用需要一些时间,并且调用Widget 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。