Завершить асинхронный вызов модели в initstate перед сборкой виджета - PullRequest
0 голосов
/ 18 июня 2019

У меня есть требование, которое заключается в том, чтобы сделать вызов API при открытии страницы и использовать результат вызова API для заполнения виджета.Я должен обслуживать случаи, например, когда выполняется вызов, показать загрузчик, если возникает ошибка, показать виджет, который позволяет пользователю перезагрузить страницу, которая вызывает этот метод снова, если вызов успешен, использовать результат для заполнениявиджет.Это выглядит как идеальный вариант использования FutureBuilder, однако, в случае сбоя вызова не будет способа перезагрузить его, поскольку FutureBuilder выполняется один раз.Альтернативой является использование StreamBuilder, где я просто добавляю в поток ошибку или ответ, это позволяет мне перезагрузить страницу в случае сбоя вызова.Подход streambuidler работает отлично.

Изначально я попытался использовать подход ScopedModel, выполнив асинхронный вызов API в методе initstate, однако, как и ожидалось, вызов api занимает некоторое время, а метод сборки виджетаВызывается так, что страница создается до завершения вызова 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
}

ОБНОВЛЕНИЕ

Я подходил к этому неправильным путем.В итоге мне понадобился не виджет с состоянием, а виджет без состояния, в котором я вызвал свое Future в методе сборки перед возвратом виджета.

...