这篇文章主要介绍了颤振中实现无背景跳转的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
<强>背景介绍强>
Navigator.of(上下文).push (MaterialPageRoute(建设者:,(上下文){ ,,return DemoPage (); }));才能
在日常的项目开发中,我们一般推动一个新页面是用上面的方法的,利用<代码> Navigator.of(上下文)代码>来进行推动或者流行操作。
缺点:这种情况是必须传上下文的目的是为了利用<代码> Navigator.of(上下文)代码>来获取到NavigatorState对象,然后才能进行推动或者流行操作。
那如果我要实现在项目的任何地方都可以推动一个新页面的话,而这个地方有可能获取不到上下文中,所以这个时候,就需要实现无背景跳转。
<强>解决方案强>
无背景跳转,本质就是不必要我们每次都去传上下文参数,然后利用一些操作直接去获取到当前的NavigatorState。
<强>方案1:利用GlobalKey 强>
- <李>
在颤振中,利用GolbalKey利用获取到对应小部件的状态对象,所以,这里,我们可以通过一个GlobalKey的键值,来获取到NavigatorState对象。
李> <李>MaterialApp中包装了WidgetsApp,而WidgetsApp包装了导航,并且将导航器的关键属性作为navigatorKey暴露出来了。所以,我们可以通过设置navigatorKey,然后利用这个关键去获取到NavigatorState对象。
李>这里贴一下相关的源码,具体的大家可以自己去看源码。
MaterialApp类:
WidgetsApp类:可以看的出,我们定义的navigatorKey,最后是会传给导航的关键值,所以我们在外面就可以通过key.currentState()方法来获取到这里的NavigatorState对象了。
class _WidgetsAppState extends State, implements WidgetsBindingObserver { ,GlobalKey _navigator; ,void _updateNavigator (), {=,,_navigator  widget.navigatorKey ? ?, GlobalObjectKey (这个); ,} , ,@override ,Widget 构建(BuildContext 上下文),{ ,Widget 导航; ,if (_navigator !=, null), { navigator 才能=,导航器( 关键:才能,_navigator, ,,initialRoute: WidgetsBinding.instance.window.defaultRouteName !=Navigator.defaultRouteName ,,? WidgetsBinding.instance.window.defaultRouteName ,,:,widget.initialRoute ? ?, WidgetsBinding.instance.window.defaultRouteName, ,,onGenerateRoute: _onGenerateRoute, ,,onUnknownRoute: _onUnknownRoute, 观察员:才能,widget.navigatorObservers, ,,); ,} }
<强>简单的代码实现强>
1,定义一个GlobalKey
, static GlobalKey, navigatorKey=GlobalKey ();
2,创建MaterialApp的对象的时候,将navigatorKey赋值给MaterialApp。
MaterialApp ( ,,,navigatorKey: Router.navigatorKey, )
使用GlobalKey在任意地方获取NavigatorState对象
navigatorKey.currentState.pushNamed (“/login");
<强>方案2:利用NavigatorObserver 强>
- <李>
NavigatorObserver,看这名字,就知道是可以用来监听导航器的变化,比如当推动一个新页面的时候,导航会监听到NavigatorState发生变化,回调didPush()方法。
李><强>注意:强> NavigatorObserver里面定义了一个NavigatorState对象导航器,所以我们可以通过自定义NavigatorObserver,然后直接利用这个导航器对象来做页面推动或者流行操作,这样的话,我们就不用自己去利用上下文去获取NavigatorState对象了。
NavigatorState类,执行instState对象的时候,会将自身赋值到监听的所有观察者对象的_navigator里面。