在 Flutter 中,我正在使用 BLoC 模式和 Firebase 制作登录/注册页面。注册用户后,我正在发送验证电子邮件并将状态更改为“VerificationEmailSentState”(这样我就可以显示 SnackBar 并在 PageView 中切换到登录页面),然后将其重新更改为初始状态(InitialState)。问题是它直接跳转到 InitialState 而没有通过 VerificationEmailSentState 因此没有显示 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 ...
}
)