Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 放置两个“;“收益率”;它在飞镖(颤振)中彼此相邻,只有第二个被执行_Flutter_Yield_Bloc - Fatal编程技术网

Flutter 放置两个“;“收益率”;它在飞镖(颤振)中彼此相邻,只有第二个被执行

Flutter 放置两个“;“收益率”;它在飞镖(颤振)中彼此相邻,只有第二个被执行,flutter,yield,bloc,Flutter,Yield,Bloc,在flatter中,我使用BLoC模式和Firebase创建了一个登录/注册页面。注册用户后,我会发送一封验证电子邮件,并将状态更改为“VerificationMailSentState”(这样我可以显示一个快捷键并在PageView中切换到登录页面),然后将其重新更改为初始状态(InitialState)。问题是它直接跳转到初始状态,而不经过VerificationMailSentState,因此不显示SnackBar或切换到登录页面 当我调试代码时,我发现它实际上正在将状态更改为(Verif

在flatter中,我使用BLoC模式和Firebase创建了一个登录/注册页面。注册用户后,我会发送一封验证电子邮件,并将状态更改为“VerificationMailSentState”(这样我可以显示一个快捷键并在PageView中切换到登录页面),然后将其重新更改为初始状态(InitialState)。问题是它直接跳转到初始状态,而不经过VerificationMailSentState,因此不显示SnackBar或切换到登录页面

当我调试代码时,我发现它实际上正在将状态更改为(VerificationMailSentState),但随后立即将其更改回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(
集团:_signupBloc,
生成器:(BuildContext上下文,SignupState){
if(状态为SignupVerificationMailSentState){
打印(“即将显示SnackBar”);//仅延迟打印
raisesnakbar();
swtichToLogin();
}
返回。。。
}
)

这实际上就是你要求它做的行为。您正在生成一个状态(
SignupVerificationEmailSentState
),然后立即将其更改回另一个状态
SignupInitialState

当状态
为SignupVerificationEmailSentState
时,您正在调用
raiseSnackBar()
,这是正确的,但是,正如您所指出的,视图正在重建,因为您实际上是在没有足够时间让用户看到
SnackBar
的情况下将其还原回来。
wait Future.delayed(持续时间(秒:1))
实际上给了它一秒钟的时间来显示它

这不是一个“坏方法”,它将取决于你的应用程序的流量和你实际想要达到的目标。然而,我宁愿这样做

Future.delayed(Duration(seconds: 1)).then((_) => yield SignupInitialState());
这不会阻止任何其他指令在该方法调用中在该指令之后运行,假设您可能有一些指令。如果你没有,那很好

如果要确保仅在显示
SnackBar
1秒后才恢复到初始状态,请删除这两行:

await Future.delayed(Duration(seconds: 1)); //Will not work without it.
yield SignupInitialState();
你可以这样做:

  Scaffold.of(context)
            .showSnackBar(
              SnackBar(
                content: Text('Something...'),
                duration: Duration(seconds: 1),
              ),
            )
            .closed
            .then((_) => bloc.revertToSignupInitialState());

谢谢你的回答。我唯一担心的是,我不是100%确定1秒就足够了,因为我认为这取决于硬件,以及执行
BlocBuilder
@AmerAlahmar中的所有语句需要多长时间。我已经用一个示例编辑了我的答案,该示例完全符合您的要求。它显示
SnackBar
,然后,当它被解除(关闭)时,它将调用'bloc.retertosignupinitialState()',该方法可以返回到该状态。
  Scaffold.of(context)
            .showSnackBar(
              SnackBar(
                content: Text('Something...'),
                duration: Duration(seconds: 1),
              ),
            )
            .closed
            .then((_) => bloc.revertToSignupInitialState());