[flutter] bloc 中进行路由跳转

2021-02-05  本文已影响0人  w_w_wei

无 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.

上一篇 下一篇

猜你喜欢

热点阅读