Flutter 入门指北(Part 6) 之路由

举报
G-washington 发表于 2019/09/03 10:38:00 2019/09/03
【摘要】 下面具体讲述Flutter 中的「路由」来管理界面,路由通过Navigator 来进行页面之间的跳转,通过直接修改 BPage 跳转 的代码来实现动画的切换。

Navigator

Flutter 通过 Navigator  来进行页面之间的跳转,分为 push 系列和 pop 系列操作,带 push 方法为入栈操作,带 pop 方法为出栈操作。Navigatorpush 方法分两类,一类是带 Name 的,需要在 MaterialApp 下将 routers 属性进行注册,否则将会找不到该路由,还有一个是不带 Name 的,可以通过 Router 直接跳转。

说那么多相信还不如直接上代码和图来的更直接。因为需要展示所有的跳转至少需要 3 个页面,所以我们创建最简单的三个界面,通过文字来区别不同的页面,因为需要调用带有 Name 的方法,所以需要先在 MaterialApp 对路由进行注册。

1567473257(1).jpg

push / pushNamed 方式跳转

我们在 APageRaiseButtononPressed 方法加入如下代码

1567473495(1).jpg

或者

1567473567(1).jpg

效果相同。跳转后,可以发现,在 BPageAppBar 上有个返回按钮,点击可以返回 APage ,那么也就是说通过 push 或者 pushNamed 方式跳转的时候,界面堆栈的变化是直接在原来的堆栈上添加一个新的 page

为了凸显堆栈的变化,所以绘制的图中,会比使用的实际页面多一个

pushReplacement / pushReplacementNamed / popAndPushNamed

APage 中的跳转方式进行替换

1567473826(1).jpg

或者

1567473897(1).jpg

或者


1567474498(1).jpg


效果相同,跳转后,可以发现 BPage 的返回按钮消失了,消失了,消失了,我们可以试下点击返回按键,发现 App 直接退出了,也就是说,BPage 替代了 APage 在堆栈中的位置。

CASE 1

这个跳转方式需要通过 CPage 来协助完成,将 APage 的跳转方式修改为 push 方式,然后在 BPage 的第一个按钮加入如下代码


1567474569(1).jpg


或者

1567475372(1).jpg


效果相同,点击 BPage 的跳转 CPage 按钮后,界面来到 CPage,然后发现还是没有返回按钮,没有返回按钮,没有返回按钮,点击下返回按键,然后发现 App 直接退出了,退出了,退出了,

CASE 2

你以为这两个方法只是为了把堆栈都清空吗,那就太图样图森破了,这边展示另一种。修改跳转的代码


1567475426(1).jpg


或者


1567475444(1).jpg


点击跳转 CPage 以后,发现返回按钮又回来了...就这么回来了...只是修改了一个参数,点击返回按钮,又回到了 APage,你可以在 APage 跳转 BPage 中加入DPage EPage 等等更多的界面,只要保证 BPage 跳转 CPage 的方式不变,点击 CPage 的返回按钮,又回到 APage


SUMMARY

为什么会这样变化呢,还记得在 MaterialApp 中注册的 router 么,APagename 对应的为 '/',也就是说,该方法会把堆栈中在 ModalRoute.withName 所对应的 page 上的所有都 pop 出堆栈,如果把参数换成 /page_b,然后在跳转 CPage 之前加入更多的界面,点击 CPage 的返回按钮,就会回到 BPage

QUESTION

这边再提个小问题,有页面 A,B,C,D,其路由的 name 分别为 '/','page_b','page_c','page_d',启动顺序为 A -> B -> C -> C -> D,那么在 D 页面使用


1567475464(1).jpg


那么堆栈最后剩下的页面是 ABCC 还是ABC 呢?答案会在最后公布,小伙伴可以先自己尝试着实现。

pop

BPage 的第二个按钮中加入 pop 操作


1567475828.jpg


跳转到 BPage 后点击该按钮,界面回到 APage,那么堆栈的变化很明显了,

popUntil

这个方法还需要借助 CPage ,在 CPage 的按钮中加入


1567475851(1).jpg


点击返回按钮,界面跳过 BPage 回到了 APage,解释同 pushAndRemoveUntil 那么堆栈的变化也显而易见咯

Navigator 传值

CASE 1 传值给下个界面

修改下 BPageAPage 的按钮点击事件


1567476374(1).jpg

1567476391(1).jpg

点击 APage 可以查看控制台有输出


2019-03-17 00:04:06.854 12868-12888/com.kuky.demo.flutterartsdemosapp I/flutter: passed value: Message From Page A


也就是成功把值传递过来了。但是,需要传递参数的话,之前在 MaterialApp 下注册的路由就需要去除了

CASE 2 传值给上个界面

这边可以查看下 pop 方法


1567476412(1).jpg


既然知道 pop 如何传递值给上个界面,那么如何在上个界面接收这个参数呢,还是看下 push 方法


1567476442(1).jpg


官方的注释非常明白的指出,会在 Future 中携带 pop 传递的参数,那么我们对 APage 跳转 BPage 以及 BPage 返回 APage 的逻辑进行修改


1567476705(1).jpg


点击返回后,能够在控制台发现有如下输入


1567476720(1).jpg


上个页面成功接收到下个页面回传的数据。

CASE 3 通过系统返回按钮传值

CASE 2 情况下,通过按钮对返回事件进行监听,那加入我们需求没有这个按钮,只能通过系统默认的返回按钮,或者物理返回按键,那该如何传值呢,这里就需要用 WillpopScope 对系统的返回按钮进行监听。我们对 CPage 做下修改,在 Scaffold 外面包裹一个 WillpopScope


1567476750(1).jpg


通过返回按钮,BPage 会成功收到从 CPage 返回的 Hello~

以上代码查看 router_main.dart 文件

路由切换动画

假如说我们不想用系统自带的切换动画,需要弄一些比较酷炫的效果该怎么办,那就需要用到自定义路由切换动画了。直接修改 BPage 跳转 CPage 的代码


1567476775(1).jpg


当再次点击跳转的时候,切换的动画就有开始自带的平滑效果变成缩放效果了。那如果要实现多个动画呢,例如边缩放,边改变透明度,也很容易实现,只需要将 child 替换成 Transition 即可


1567477126(1).png


当然,为了方便重复利用,需要进行封装,例如我们要封装上面的缩放动画效果


1567477165(1).jpg


然后直接在 Navigator 跳转的时候调用该 Route 就可以了

该部分代码查看 custom_routes.dart 文件

还记得我们之前写的 demo 都是单个文件写一个入口的吗,现在我们就可以写一个统一管理的页面,对这些界面进行管理了,这个工作就交给大家伙自己了,当然我也在源码做了修改,可以查看 main.dart 文件

在前面有提出一个问题,这边公布下答案:堆栈中的页面应该为 ABCC。你答对没有呢~

最后代码的地址还是要的:

  1. 文章中涉及的代码:demos


本文转载自异步社区

原文链接:https://www.epubit.com/articleDetails?id=Neefc8afb-209d-4a90-b27a-0b9ab7ab92b8

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。