概述

新版Flutter包含两个版本的导航器,分别是Navigator 1.0和Navigator 2.0。Navigator 2.0是从Flutter 1.22版开始引入的一个全新的导航器,其相比1.0功能更多也更加的灵活,当然了从使用的难易程度上来说Navigator 2.0比Navigator 1.0要难上手一些。

QA:Navigator 2.0出来后Navigator 1.0还能继续用吗?

相信很多同学有这样的疑问,Navigator 2.0是对Navigator 1.0的补充,目前Flutter官方还没有将Navigator 1.0从Flutter中移除的计划,所以大家可以根据需要选择使用这两种导航器。当然了,作为从事Flutter开发的同学如果对Flutter的新特性,比如Navigator 2.0一点都不了解那么肯定是说不过去的,那么接下来我们就来重点学习下Navigator 2.0的特性、原理以及使用技巧。

QA:选择Navigator 2.0还是fluro?

fluro也是一个不错的Flutter导航框架,它和Navigator没有绝对的好与坏,主要区别是一个是社区的,一个是官方的。fluro的出现主要是解决Navigator 1.0功能弱的问题,但这在Navigator 2.0已经得到了很好的缓解。

  • 如果你的项目之前是有的就是fluro,那么可以根据需要继续使用;
  • 如果你的项目用的是Navigator 1.0,那么可以择机升级到Navigator 2.0;
  • 如果你的项目是一个新的项目没有历史包袱,那么可以一步到位直接上手Navigator 2.0;

QA:为什么Navigator 2 比Navigator 1 复杂这么多?

  • Navigator 2 为了提供对Flutter Web的支持新引入了很多的API和概念,比如:Pag、Router、RouterDelegate、RouteInformationParser,除此之外还需要自己管理路由栈,比Navigator 1 的复杂度高出了一个量级;
  • 但这些API并不是必须要是要实用的,对应一个APP的导航框架来说只需要用到Router、Page、RouterDelegate就可以了,其中Router、Page的使用比较简单,主要是RouterDelegate比较复杂;
  • RouterDelegate中最为核心的一点是在build方法中来实现对路由栈的管理,这个参考课程中的设计就可以了;
  • 对Navigator 2的使用和理解不仅仅停留在看视频上,要参考着课程中的讲解,动手去写多写几遍,以及跟着后面的实战项目按部就班的学习,然后回过头来在来看之前不理解的部分,就会豁然开朗了;

Navigator 2.0特性

  • 支持自定义页面的路由栈;
  • 支持一次打开或关闭多个页面;
  • 支持删除当前页面下的页面;

那这些特性能都是Navigator 1.0没有或很难实现的一个功能。

Navigator 1.0主要功能回顾

打开和关闭页面是平时开发中最常用的一个功能,那么在Navigator 1.0中最常用的打开和关闭页面的方式是什么呢?

打开一个页面

Navigator.push(context, MaterialPageRoute(builder: (context) => page));

关闭一个页面

Navigator.pop(context);

走进Navigator 2.0

Navigator 2.0 提供了一系列全新的接口,可以实现将路由状态成为应用状态的一部分,并提供解析来自底层平台如:(Web URL)的路由的功能,新增的 API 如下:

  • Page:用来表示 Navigator 路由栈中各个页面的不可变对象;

    • Page是个抽象类通常使用它的派生类:MaterialPage或CupertinoPage;
  • Router:用来配置要由 Navigator 展示的页面列表,通常,该页面列表会根据系统或应用程序的状态改变而改变;
    • 除了可以直接使用Router本身外还可以使用MaterialApp.router()来创建Router;
  • RouterDelegate:定义应用程序中的路由行为,例如 Router 如何知道应用程序状态的变化以及如何响应;
    • 主要的工作就是监听RouteInformationParser和应用状态,并使用当前列表来构建Pages;
  • RouteInformationParser:可缺省,主要应用与web,持有RouteInformationProvider 提供的 RouteInformation ,可以将其解析为我们定义的数据类型;
  • BackButtonDispatcher:响应后退按钮,并通知 Router

Tips:上面API中BackButtonDispatcher是用到的情况很少,另外对应移动端APP开发来说我们只需要用到Navigator 2.0 中的Page、Router、RouterDelegate这三个API即可,RouteInformationParser与RouteInformationProvider主要是应用于开发web网站的路由用的;

下图展示了 RouterDelegate 与 Router、RouteInformationParser 在一起的交互和应用程序的状态:

流程解析:

  1. 当系统打开新页面(如 “/detail”)时,RouteInformationParser 会将其转换为应用中的具体数据类型 T(如:BiliRoutePath);
  2. 该数据类型会被传递给 RouterDelegate 的 setNewRoutePath 方法,我们可以在这里更新路由状态;
  3. notifyListeners 会通知 Router 重建 RouterDelegate(通过 build() 方法);
  4. RouterDelegate.build() 返回一个新的 Navigator 实例,并最终展示出我们想要打开的页面;

Flutter 新版Navigator (一)相关推荐

  1. Flutter入门:如何只关闭自身页面

    flutter的路由管理很方便,push和pop就可以了,但是pop只能关闭栈顶的页面,在某些需求中就显得力不从心了. 比如我们有一个倒计时弹窗(flutter中弹窗其实也是页面),倒计时结束后关闭. ...

  2. flutter之: GetX 的 路由管理

    1.如何使用 将此添加到pubspec.yaml文件中. dependencies:get: 在MaterialApp前面加上 "Get",就可以把它变成GetMaterialAp ...

  3. Flutter路由管理和接收页面的返回值

    Flutter使用Navigator进行路由管理. 跳转页面 使用Navigator的push方法进行跳转.可以看到总共有6个push方法 1.push(route) 通过路由跳转 通过路由进行跳转 ...

  4. Flutter 全局弹窗

    背景 开发flutter-ui过程中,遇到了全局弹窗问题 友好的交互界面,能够产生更好的用户体验,比如查询接口较久或需要耗时处理程序时,给个loading效果. flutter组件中showDialo ...

  5. 为什么 Flutter 是跨平台开发的终极之选

    跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱.最流行的跨平台框架有 Xamarin.PhoneGap.Ionic.Titanium.Monaca.Se ...

  6. 为什么Flutter是跨平台开发的终极之选

    作者 | Anchal Malik 译者 | 王强 来源 | 前端之巅 跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱. 最流行的跨平台框架有 Xama ...

  7. 为什么Flutter是跨平台开发的终极之选,这篇文章可以满足你80%日常工作

    本质上来说,跨平台开发就是"一石二鸟"的开发技术.下面简单解释一下.早期没有跨平台框架的时候,开发者必须为同一应用的各个平台(比如 Android.iOS.Windows 等)分别 ...

  8. 为什么Flutter是跨平台开发的终极之选,android完整项目源码

    它完全免费,彻底开源 可以用来更快地创建应用 出色的用户界面(UI) 节省代码量 可接入平台原生功能 最适合 MVP 开发(最小化可行产品) 较老的设备也使用相同 UI 运行应用 减少测试工作量 更丰 ...

  9. 使用 Flutter Navigator2.0 最舒服的姿势

    flutter 路由2.0 的文章不少,大都是讲理论居多,本文主要讲实战.目前来说实际开发中很少需要兼容 web,说了那么多有关 url 的解析有什么用?不考虑 web,就省了很多事. 在 Navig ...

  10. Flutter项目该如何选择状态管理?

    状态管理原则 我们在开发过程中,为了提高项目的可维护度和性能,也为了让页面UI跟数据(本地或服务端数据)有效分离的同时又能有效同步,都会让项目保持清晰的目录结构.同时启用状态管理库. 而MVVM模式已 ...

最新文章

  1. Play自动生成的项目目录简介
  2. python调用zabbix api接口实时展示数据
  3. 大数据之“用户行为分析”
  4. python mapreduce函数_Map-reduce在Python高阶函数中的应用,python,用法,之,mapreduce
  5. .NET 反编译调试神器:dnSpy了解一下
  6. linux交叉编译tile环境搭建,g ++ - 在Ubuntu中在32位上交叉编译64位程序时,缺少包含“bits / c ++ config.h”...
  7. 【OpenCV 例程200篇】71. 连续函数的取样
  8. 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
  9. 深入玩转K8S之智能化的业务弹性伸缩和滚动更新操作
  10. 激光干涉仪使用方法_激光干涉仪选择几点建议「智能制造2025」
  11. Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
  12. oracle的aud文件,oracle asm实例的aud文件有关问题
  13. webService发布和调用--Axis2
  14. 快压卸载后,右键打开压缩文件时还是有快压,方案:删除注册表相关项
  15. 0.96寸OLED 屏幕SSD1306驱动四脚原理图PDF
  16. x265中Encoder::encode流程
  17. 抖音快手民俗的作品制作方法
  18. prism 修改默认的View和ViewModel映射
  19. java后端系统学习总结 01_java第五版 java初学笔记,由浅入深
  20. PayPal开发文档整理(8)——PayPal支付产品和解决方案

热门文章

  1. JZOJ【NOI2017模拟3.30】原谅
  2. 短信网关协议(cmpp、sgip、smgp、smpp)长短信开发要点
  3. redis streams_如何使用Redis Streams
  4. linux查看磁盘naa,linux查看计算机硬件信息
  5. CentOS等保三级安全加固方案
  6. 【博客话题】人在囧途之“运维囧”
  7. java阿里天气接口_天气预报接口
  8. 国防科大计算机学院贾焰,博士群体竞风流——记国防科大教员队伍的变化
  9. 周进院长担任EVO ICL导师,理论+实践培训学员技能
  10. 双活数据中心构建方法及实现技术