颤振中实现无背景跳转的示例

  介绍

这篇文章主要介绍了颤振中实现无背景跳转的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>背景介绍

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对象了。

颤振中实现无背景跳转的示例“> <br/> </p> <p> MaterialApp类,提供了navigatorObservers属性,这样我们就可以自定义NavigatorObserver去监听导航器的变化。</p> <p> <img src=

NavigatorState类,执行instState对象的时候,会将自身赋值到监听的所有观察者对象的_navigator里面。

颤振中实现无背景跳转的示例“> <h2 class=颤振中实现无背景跳转的示例