![](/img/trans.png)
[英]Flutter Bloc add event triggers only once for the same widget and won't trigger again
[英]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.