Flutter中如何实现无Context跳转详解

 更新时间:2019年09月06日 14:06:02   作者:入魔的冬瓜  
这篇文章主要给大家介绍了关于Flutter中如何实现无Context跳转的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

背景介绍

Navigator.of(context).push(MaterialPageRoute(builder: (context){
   return DemoPage();
  }));

在日常的项目开发中,我们一般push一个新页面是用上面的方法的,利用Navigator.of(context)来进行push或者pop操作。

缺点:这种情况是必须传context的,目的是为了利用Navigator.of(context)来获取到NavigatorState对象,然后才能进行push或者pop操作。

那如果我要实现在项目的任何地方都可以push一个新页面的话,而这个地方有可能获取不到context,所以这个时候,就需要实现无context跳转。

解决方案

无context跳转,本质就是不必要我们每次都去传context参数,然后利用一些操作直接去获取到当前的NavigatorState。

方案1:利用GlobalKey

  • 在Flutter中,利用GolbalKey利用获取到对应Widget的State对象。所以,这里,我们可以通过一个GlobalKey的key值,来获取到NavigatorState对象。
  • MaterialApp中包装了WidgetsApp,而WidgetsApp包装了Navigator,并且将 Navigator的key属性作为navigatorKey暴露出来了。所以,我们可以通过设置navigatorKey,然后利用这个key去获取到NavigatorState对象。

这里贴一下相关的源码,具体的大家可以自己去看源码。

MaterialApp类:

WidgetsApp类:可以看出,我们定义的navigatorKey,最后是会传给Navigator的key值,所以我们在外面就可以通过key.currentState()方法来获取到这里的NavigatorState对象了。

class _WidgetsAppState extends State<WidgetsApp> implements WidgetsBindingObserver {

 GlobalKey<NavigatorState> _navigator;

 void _updateNavigator() {
 _navigator = widget.navigatorKey ?? GlobalObjectKey<NavigatorState>(this);
 }
 
 @override
 Widget build(BuildContext context) {
 Widget navigator;
 if (_navigator != null) {
  navigator = Navigator(
  key: _navigator,
  initialRoute: WidgetsBinding.instance.window.defaultRouteName != Navigator.defaultRouteName
   ? WidgetsBinding.instance.window.defaultRouteName
   : widget.initialRoute ?? WidgetsBinding.instance.window.defaultRouteName,
  onGenerateRoute: _onGenerateRoute,
  onUnknownRoute: _onUnknownRoute,
  observers: widget.navigatorObservers,
  );
 }
}

简单的代码实现

1、定义一个GlobalKey< NavigatorState>对象

 static GlobalKey<NavigatorState> navigatorKey=GlobalKey();

2、创建MaterialApp的对象的时候,将navigatorKey赋值给MaterialApp。

MaterialApp(
   navigatorKey: Router.navigatorKey,
)

使用GlobalKey在任意地方获取NavigatorState对象

navigatorKey.currentState.pushNamed("/login");

方案2:利用NavigatorObserver

  • NavigatorObserver,看这名字,就知道是可以用来监听Navigator的变化。比如当push一个新页面的时候,Navigator会监听到NavigatorState发生变化,回调didPush()方法。

注意:NavigatorObserver里面定义了一个NavigatorState对象navigator,所以我们可以通过自定义NavigatorObserver,然后直接利用这个navigator对象来做页面push或者pop操作,这样的话,我们就不用自己去利用context去获取navigatorState对象了。


MaterialApp类,提供了navigatorObservers属性,这样我们就可以自定义NavigatorObserver去监听Navigator的变化。

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


简单的代码实现

1、自定义NavigatorObserver。

class CustomNavigatorObserver extends NavigatorObserver{
 static CustomNavigatorObserver _instance;

 static CustomNavigatorObserver getInstance() {
 if (_instance == null) {
  _instance = CustomNavigatorObserver();
 }
 return _instance;
 }
}

2、创建MaterialApp的对象的时候,将CustomNavigatorObserver赋值给MaterialApp

MaterialApp(
   navigatorObservers: [CustomNavigatorObserver()],
)

3、使用CustomNavigatorObserver在任意地方进行页面操作

CustomNavigatorObserver.getInstance().navigator.pushNamed("/login");

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • 关于Android bitmap你不知道的一些事

    关于Android bitmap你不知道的一些事

    这篇文章主要为大家详细介绍了关于Android bitmap你不知道的一些事,使用bitmap需要注意的一些细节,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android Camera变焦编程步骤

    Android Camera变焦编程步骤

    这篇文章主要介绍了Android Camera变焦编程步骤,本文讲解了添加Camera权限、判断是否支持变焦、修改焦距等步骤,并分别给出了操作代码,需要的朋友可以参考下
    2015-04-04
  • android LabelView实现标签云效果

    android LabelView实现标签云效果

    这篇文章主要为大家详细介绍了android LabelView实现标签云效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android编程实现WebView自适应全屏方法小结

    Android编程实现WebView自适应全屏方法小结

    这篇文章主要介绍了Android编程实现WebView自适应全屏方法,结合实例形式总结了三种常用的WebView自适应全屏实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • Android 十六进制状态管理实例详解

    Android 十六进制状态管理实例详解

    这篇文章主要为大家介绍了Android 十六进制状态管理实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • android图像绘制(三)画布刷屏问题记录

    android图像绘制(三)画布刷屏问题记录

    在canvas中绘制动态图的时候,如果使用了一个固定的背景图片,只有一个小小的精灵在移动!这样的情况下却不得不在没帧中重新绘制背景图片,使得效率降低,本文章只是记录一下,并不是解决方法感兴趣的朋友可以了解下
    2013-01-01
  • Android金额输入框只允许输入小数点后两位效果

    Android金额输入框只允许输入小数点后两位效果

    实现android 金额输入框输入小数点后两位的效果也不是很复杂,只需要设置输入框输入的字符类型、设置InputFilter、设置输入变化监听即可。这篇文章主要介绍了Android金额输入框只允许输入小数点后两位 ,需要的朋友可以参考下
    2017-05-05
  • flutter日期选择器 flutter时间选择器

    flutter日期选择器 flutter时间选择器

    这篇文章主要为大家详细介绍了flutter日期选择器,flutter时间选择器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Android AIDL实现与服务相互调用方式

    Android AIDL实现与服务相互调用方式

    这篇文章主要介绍了Android AIDL实现与服务相互调用方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android手势操作简单实例讲解

    Android手势操作简单实例讲解

    这篇文章主要为大家详细介绍了Android手势操作简单实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09

最新评论