簡體   English   中英

Flutter 再次觸發 bloc 事件

[英]Flutter Trigger bloc event again

在我的第一個屏幕上,我填寫了表格,然后單擊下一個按鈕,它將SubmitDataEvent()添加到該集團。 然后,BolcListner 列表和SuccessSate導航到下一個屏幕。

在第二個屏幕上,當我單擊后退按鈕時,它會導航到上一個屏幕。 之后,當我更改表單上的用戶輸入數據並再次單擊下一步按鈕時,現在未添加SubmitDataEvent()

我更喜歡與此相關的一些資源,我理解問題是 state 處於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);            }
          },
....

您可以嘗試使用此代碼段

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM