【问题标题】:Flutter Trigger bloc event againFlutter 再次触发 bloc 事件
【发布时间】:2022-01-01 19:02:59
【问题描述】:

在我的第一个屏幕上,我填写了表格,然后单击下一步按钮,它将 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 它导航到下一个屏幕。当我单击第二页上的后退按钮时,它会再次导航到第一个屏幕。现在,当我单击第一个屏幕上的下一步按钮时 我想再次运行所有 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);            }
          },
....

【问题讨论】:

  • 你在哪里创建你的集团?
  • 拜托,分享块代码sn-p。
  • 我在页面顶部使用了 bloc provider
  • 尝试使用 Navigator.pushNamed() 或 Navigator.pushReplacementNamed() 进行导航
  • @Poran 我添加了代码

标签: flutter dart bloc state-management flutter-bloc


【解决方案1】:

你可以试试这个sn-p

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

【讨论】:

  • 还是不行
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2022-07-26
    • 2021-03-29
    • 2020-12-11
    • 1970-01-01
    • 2022-10-06
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多