#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(); }