Снова событие блока триггера флаттера

#flutter #dart #bloc #state-management #flutter-bloc

Вопрос:

На моем первом экране я заполняю форму, а затем нажимаю кнопку «Далее», которую она добавила SubmitDataEvent() в блок. Затем перейдите к списку BolcListner и, когда дело дойдет до SuccessSate него, перейдите к следующему экрану.

на втором экране, когда я нажимаю кнопку «Назад», он переходит к предыдущему экрану. После этого, когда я изменяю введенные пользователем данные в форме и снова нажимаю кнопку Далее, теперь SubmitDataEvent() это не добавляется.

Я предпочел некоторые ресурсы, связанные с этим, и я понимаю, что проблема в том, что состояние находится SuccessSate и оно не меняется InitialState . Так что в dispose() Я использовал bloc.close();

 @override  void dispose() {  bloc.close();  super.dispose();  }  

Но все равно, это не работает. Кроме того, я пытаюсь использовать этот код

 @override  void dispose() {  bloc.emit(InitialState);  bloc.close();  super.dispose();  }  

и все равно это не работает.

Я использовал это для навигации между экранами:

 Navigator.popAndPushNamed()  

Что я хочу сделать, так это: На первом экране при нажатии на кнопку далее SubmitDataEvent() добавляется блок и он в SuccessState нем переходит на следующий экран. Когда я нажимаю кнопку «Назад» на второй странице, она снова переходит на первый экран. Теперь, когда я нажимаю кнопку «Далее» на первом экране, я хочу снова запустить весь процесс блока. Нет никаких зависимостей с первым и вторым экранами.

код первого экрана:

 ... @override  void initState() {  super.initState();   bloc = injectionlt;SubmitPersonalDetailsBlocgt;();   EasyLoading.addStatusCallback((status) {  print('EasyLoading Status $status');  if (status == EasyLoadingStatus.dismiss) {  _timer?.cancel();  }  });  }   @override  void dispose() {  _scrollController.dispose();  bloc.close();  super.dispose();  }  @override  Widget buildView(BuildContext context) {  return Scaffold(  body: BlocProviderlt;SubmitPersonalDetailsBlocgt;(  create: (_) =gt; bloc,  child: BlocListenerlt;SubmitPersonalDetailsBloc,  BaseStatelt;PersonalDetailsStategt;gt;(  listener: (context, state) {  if (state is LoadingSubmitPersonalDetailsState) {  EasyLoading.show(status: 'Submitting Data');  }  if (state is SubmitPersonalDetailsSuccessState) {  setState(() {  submitPersonalDetailsResponseEntity =  state.submitPersonalDetailsResponseEntity;  });  if (submitPersonalDetailsResponseEntity!.responseCode == "00") {  EasyLoading.showSuccess('Done!');  //Navigate next screen  EasyLoading.dismiss();  }  } else if (state is SubmitPersonalDetailsFailedState) {  EasyLoading.showError(state.error); }  }, ....  

Комментарии:

1. Где вы создаете свой блок?

2. Пожалуйста, поделитесь фрагментом кода.

3. Я использовал поставщика блоков в верхней части моей страницы

4. Попробуйте использовать Navigator.pushNamed() или Navigator.pushReplacementNamed() для навигации

5. @Poran Я добавил код

Ответ №1:

Вы можете попробовать с помощью этого фрагмента

 if (result.responseCode == APIResponse.RESPONSE_SUCCESS) {  yield SubmitPersonalDetailsSuccessState(  submitPersonalDetailsResponseEntity: r);  } else  yield SubmitPersonalDetailsFailedState(error: r.responseMsg);  }  

Комментарии:

1. все еще не работает

Ответ №2:

Проблема заключается в внедрении зависимостей, как только он создает экземпляр, параметры не меняются. Поэтому при переходе к следующему экрану необходимо сбросить этот экземпляр.

 @override  void dispose() {  _scrollController.dispose();  bloc.close();  injection.resetLazySingletonlt;SubmitPersonalDetailsBlocgt;(); // here reset the instance  super.dispose();  }