在构建小部件之前在initstate中完成作用域模型异步调用

时间:2019-06-18 14:19:45

标签: flutter scoped-model

我有一个要求,即在打开页面时进行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。

0 个答案:

没有答案