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