在Flutter中,我正在使用BLoC模式和Firebase创建一个登录/注册页面。注册用户后,我会发送验证电子邮件并将状态更改为“VerificationEmailSentState”(以便在PageView中显示SnackBar并切换到登录页面),然后再将其重新更改为初始状态(InitialState)。问题是它直接跳转到InitialState而不经过VerificationEmailSentState,因此没有显示SnackBar或切换到登录页面!
在调试代码时,我发现它实际上已将状态更改为(VerificationEmailSentState),但立即将其更改回InitialState,因此BlocBuilder内部的代码未被执行,因为它在将状态更改为InitialState时被中断(重新构建) 。为确保它可以工作,我在第一次更改状态后延迟了1秒,并且它起作用了(SnackBar出现)。
问题是为什么会发生这种情况? 延迟第二次更改状态是否是一个好主意? 如果不是,如何在不延迟的情况下使其工作?
在调试代码时,我发现它实际上已将状态更改为(VerificationEmailSentState),但立即将其更改回InitialState,因此BlocBuilder内部的代码未被执行,因为它在将状态更改为InitialState时被中断(重新构建) 。为确保它可以工作,我在第一次更改状态后延迟了1秒,并且它起作用了(SnackBar出现)。
问题是为什么会发生这种情况? 延迟第二次更改状态是否是一个好主意? 如果不是,如何在不延迟的情况下使其工作?
//SignupBloc
await user.sendEmailVerification();
yield SignupVerificationEmailSentState();
await Future.delayed(Duration(seconds: 1)); //Will not work without it.
yield SignupInitialState();
//LoginSignupPage
BlocBuilder<SignupEvent, SignupState>(
bloc: _signupBloc,
builder: (BuildContext context, SignupState state) {
if (state is SignupVerificationEmailSentState) {
print("About to show SnackBar");//Printed only with delay
raiseSnackBar();
swtichToLogin();
}
return ...
}
)
BlocBuilder
内所有语句所需的时间。 - Amer AlahmarSnackBar
,当其被关闭时,它将调用bloc.revertToSignupInitialState()
方法,该方法可以是一个返回到该状态的方法。 - Miguel Ruivo