Flutter 再次触发 bloc 事件

Flutter Trigger bloc event again

在我的第一个屏幕上,我填写了表格,然后单击它添加 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()

我想做的是: 在第一个屏幕上,当单击添加到 bloc 的下一个按钮 SubmitDataEvent() 时,它会在 SuccessState 中导航到下一个屏幕。当我单击第二页上的后退按钮时,它会再次导航到第一个屏幕。现在,当我单击第一个屏幕上的下一步按钮时 我想再次 运行 所有 bloc 进程。 第一屏和第二屏没有依赖关系。

首屏代码:

...
@override
  void initState() {
    super.initState();

    bloc = injection<SubmitPersonalDetailsBloc>();

    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: BlocProvider<SubmitPersonalDetailsBloc>(
        create: (_) => bloc,
        child: BlocListener<SubmitPersonalDetailsBloc,
            BaseState<PersonalDetailsState>>(
          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);            }
          },
....

您可以尝试使用此代码段

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

问题出在依赖注入上,一旦它创建了一个实例,参数就不会改变。因此,当导航到下一个屏幕时必须重置该实例。

@override
  void dispose() {
    _scrollController.dispose();
    bloc.close();
    injection.resetLazySingleton<SubmitPersonalDetailsBloc>(); // here reset the instance
    super.dispose();
  }