无 BuildContext 路由
我们使用 navigatorState在没有 BuildContext 的情况下进行路由
在 NavigatorBloc 构造函数中, 接受一个 包含 navigator state 的 Global key 作为参数, 这个Bloc 应该只接受页面直接的navigate 事件。
class NavigatorBloc extends Bloc<NavigatorAction, dynamic>{
final GlobalKey<NavigatorState> navigatorKey;
NavigatorBloc({this.navigatorKey});
@override
dynamic get initialState => 0;
@override
Stream<dynamic> mapEventToState(NavigatorAction event) async* {
if(event is NavigatorActionPop){
navigatorKey.currentState.pop();
}else if(event is NavigateToHomeEvent){
navigatorKey.currentState.pushNamed('/home');
}
}
}
创建一个用于存储 navigator state的global key,然后将其传递给MaterialApp。另外,我们应该将此属性传递给NavigatorBloc。
class _MyAppState extends State<MyApp> {
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey();
@override
Widget build(BuildContext context) {
return BlocProvider<NavigatorBloc>(
bloc: NavigatorBloc(navigatorKey: _navigatorKey),
child: MaterialApp(
navigatorKey: _navigatorKey,
title: 'My App',
home: HomePage(),
),
);
}
}
对于每个导航,您只需创建一个事件即可导航到每个特定页面。现在,我们可以从任何BLoC导航到任意页面。
Tip:使用BlocProvider.of <NavigatorBloc>(context).dispatch(NavigateToHomeEvent());在任何小部件中使用 navigator BLoc 导航到另一个页面。这样,您将拥有一个集中的navigation class.
网友评论