Flutter 新版Navigator (一)
概述
新版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 在一起的交互和应用程序的状态:
流程解析:
- 当系统打开新页面(如 “/detail”)时,RouteInformationParser 会将其转换为应用中的具体数据类型 T(如:BiliRoutePath);
- 该数据类型会被传递给 RouterDelegate 的 setNewRoutePath 方法,我们可以在这里更新路由状态;
- notifyListeners 会通知 Router 重建 RouterDelegate(通过 build() 方法);
- RouterDelegate.build() 返回一个新的 Navigator 实例,并最终展示出我们想要打开的页面;
Flutter 新版Navigator (一)相关推荐
- Flutter入门:如何只关闭自身页面
flutter的路由管理很方便,push和pop就可以了,但是pop只能关闭栈顶的页面,在某些需求中就显得力不从心了. 比如我们有一个倒计时弹窗(flutter中弹窗其实也是页面),倒计时结束后关闭. ...
- flutter之: GetX 的 路由管理
1.如何使用 将此添加到pubspec.yaml文件中. dependencies:get: 在MaterialApp前面加上 "Get",就可以把它变成GetMaterialAp ...
- Flutter路由管理和接收页面的返回值
Flutter使用Navigator进行路由管理. 跳转页面 使用Navigator的push方法进行跳转.可以看到总共有6个push方法 1.push(route) 通过路由跳转 通过路由进行跳转 ...
- Flutter 全局弹窗
背景 开发flutter-ui过程中,遇到了全局弹窗问题 友好的交互界面,能够产生更好的用户体验,比如查询接口较久或需要耗时处理程序时,给个loading效果. flutter组件中showDialo ...
- 为什么 Flutter 是跨平台开发的终极之选
跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱.最流行的跨平台框架有 Xamarin.PhoneGap.Ionic.Titanium.Monaca.Se ...
- 为什么Flutter是跨平台开发的终极之选
作者 | Anchal Malik 译者 | 王强 来源 | 前端之巅 跨平台开发是当下最受欢迎.应用最广泛的框架之一.能实现跨平台开发的框架也五花八门,让人眼花缭乱. 最流行的跨平台框架有 Xama ...
- 为什么Flutter是跨平台开发的终极之选,这篇文章可以满足你80%日常工作
本质上来说,跨平台开发就是"一石二鸟"的开发技术.下面简单解释一下.早期没有跨平台框架的时候,开发者必须为同一应用的各个平台(比如 Android.iOS.Windows 等)分别 ...
- 为什么Flutter是跨平台开发的终极之选,android完整项目源码
它完全免费,彻底开源 可以用来更快地创建应用 出色的用户界面(UI) 节省代码量 可接入平台原生功能 最适合 MVP 开发(最小化可行产品) 较老的设备也使用相同 UI 运行应用 减少测试工作量 更丰 ...
- 使用 Flutter Navigator2.0 最舒服的姿势
flutter 路由2.0 的文章不少,大都是讲理论居多,本文主要讲实战.目前来说实际开发中很少需要兼容 web,说了那么多有关 url 的解析有什么用?不考虑 web,就省了很多事. 在 Navig ...
- Flutter项目该如何选择状态管理?
状态管理原则 我们在开发过程中,为了提高项目的可维护度和性能,也为了让页面UI跟数据(本地或服务端数据)有效分离的同时又能有效同步,都会让项目保持清晰的目录结构.同时启用状态管理库. 而MVVM模式已 ...
最新文章
- Play自动生成的项目目录简介
- python调用zabbix api接口实时展示数据
- 大数据之“用户行为分析”
- python mapreduce函数_Map-reduce在Python高阶函数中的应用,python,用法,之,mapreduce
- .NET 反编译调试神器:dnSpy了解一下
- linux交叉编译tile环境搭建,g ++ - 在Ubuntu中在32位上交叉编译64位程序时,缺少包含“bits / c ++ config.h”...
- 【OpenCV 例程200篇】71. 连续函数的取样
- 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
- 深入玩转K8S之智能化的业务弹性伸缩和滚动更新操作
- 激光干涉仪使用方法_激光干涉仪选择几点建议「智能制造2025」
- Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
- oracle的aud文件,oracle asm实例的aud文件有关问题
- webService发布和调用--Axis2
- 快压卸载后,右键打开压缩文件时还是有快压,方案:删除注册表相关项
- 0.96寸OLED 屏幕SSD1306驱动四脚原理图PDF
- x265中Encoder::encode流程
- 抖音快手民俗的作品制作方法
- prism 修改默认的View和ViewModel映射
- java后端系统学习总结 01_java第五版 java初学笔记,由浅入深
- PayPal开发文档整理(8)——PayPal支付产品和解决方案
热门文章
- JZOJ【NOI2017模拟3.30】原谅
- 短信网关协议(cmpp、sgip、smgp、smpp)长短信开发要点
- redis streams_如何使用Redis Streams
- linux查看磁盘naa,linux查看计算机硬件信息
- CentOS等保三级安全加固方案
- 【博客话题】人在囧途之“运维囧”
- java阿里天气接口_天气预报接口
- 国防科大计算机学院贾焰,博士群体竞风流——记国防科大教员队伍的变化
- 周进院长担任EVO ICL导师,理论+实践培训学员技能
- 双活数据中心构建方法及实现技术