我关注的问题是在BLoC模式中使用的导航(navigation)。
在我的LoginScreen小部件中,我有一个按钮,用于将事件添加到bloc的EventSink中。 bloc调用API并验证用户身份。 在LoginScreen小部件中,我在哪里监听流,并在成功返回状态后如何导航到另一个屏幕?
我关注的问题是在BLoC模式中使用的导航(navigation)。
在我的LoginScreen小部件中,我有一个按钮,用于将事件添加到bloc的EventSink中。 bloc调用API并验证用户身份。 在LoginScreen小部件中,我在哪里监听流,并在成功返回状态后如何导航到另一个屏幕?
使用BlockListener。
BlocListener(
bloc: _yourBloc,
listener: (BuildContext context, YourState state) {
if(state is NavigateToSecondScreen){
Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {return SecondScreen();}));
}
},
child: childWidget
)
BlocListener(
bloc: _yourBloc,
listener: (BuildContext context, YourState state) {
if(state is NavigateToSecondScreen){
Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {return SecondScreen();}));
}
},
child: childWidget
)
BlocConsumer<BlocA, BlocAState>(
listenWhen: (previous, current) {
// Return true/false to determine whether or not
// to invoke listener with state
},
listener: (context, state) {
// Do stuff here based on BlocA's state
},
buildWhen: (previous, current) {
// Return true/false to determine whether or not
// to rebuild the widget with state
},
builder: (context, state) {
// Return widget here based on BlocA's state
}
)
类似这样:
if (state is PhoneLoginCodeSent) {
// Dispatch here to reset PhoneLoginFormState
SchedulerBinding.instance.addPostFrameCallback((_) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) {
return VerifyCodeForm(phoneLoginBloc: _phoneLoginBloc);
},
),
);
return;
});
}
initState
中监听它,并根据流的结果使用Navigator.push()
进行导航。 - nonybrighto