热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter入门进阶之旅(十三)Flutter路由

Flutter路由介绍跟Web页或者原生APP一样,我们在使用Flutter开发APP时也会涉及到多页面之间的跳转、参数传递、参数回传等业务,

Flutter路由介绍

跟Web页或者原生APP一样,我们在使用Flutter 开发APP时也会涉及到多页面之间的跳转、参数传递、参数回传等业务,Flutter路由能满足上述我们提到的所有业务类型,此外我们也可以结合Flutter动画给路由跳页时添加个性化的跳页动画操作,我会在后续Flutter动画章节中具体讲解。通过本节专题,读者不仅仅可以自己动手做一些简单的UI,还能利用Fluttter 路由结合之前的课程分享做一些简单的多页面Flutter App。

本期课程目标
  • 了解并掌握Flutter路由的简单使用
  • 掌握Flutter动态路由跟静态路由的区别
  • 掌握Flutter路由在页面间的参数传递以及回传流程
  • 借助路由结合之前的课程做一些简单的多页面Flutter APP

关于静态路由跟动态路由

在Flutter中路由分为静态路由动态路由两种:Flutter中所谓的静态路由指的是需要提前把各个需要跳转的页面路径注册在routes: {}中,且静态路由不支持向下一个页面传递参数,但是可以接收下一个页面的返回值
动态路由使用就相对来说比较灵活一点,动态路由同样支持向下一个页面传递参数,而且在使用时不需要我们提前规划好页面路径,只需要在具体跳页逻辑中自己去构造MaterialPageRoute对象来完成页面跳转,或者用PageRouterBuilder来自定义路由跳转时的动画,关于路由跳转动画我会在Flutter动画章节中具体讲解,当然动态路由同样也支持页面参数回传。

路由场景分类

1.静态路由跳页

场景一:点击A页面中的按钮跳转到B页,不涉及到数据传递以及回传

效果图

Flutter入门进阶之旅(十三)Flutter 路由
静态路由跳页

静态路由使用时要求我们在MaterialApp中的routes中提前注册路由

new MaterialApp( home: new FlutterDemo(), routes: { 'router/new_page': (_) => new StaticNavigatorPage() }));

A页面代码

import 'package:flutter/material.dart'; import 'package:flutter_app/pages/simpleWidget/navigator/StaticNavigatorPage.dart'; void main() { runApp(new MaterialApp( home: new FlutterDemo(), routes: { 'router/new_page': (_) => new StaticNavigatorPage() })); } class FlutterDemo extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("Flutter进阶之旅"), ), body: new Center( child: new RaisedButton( child: new Text("静态路由跳页"), onPressed: () { Navigator.of(context) .pushNamed('router/new_page'); //这里一定要保证跳页的路由路径跟上面注册的路径一致 })), ); } }

B页面代码

import 'package:flutter/material.dart'; class StaticNavigatorPage extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("静态路由页"), ), floatingActionButton: new FloatingActionButton( onPressed: () { Navigator.of(context).pop(); }, child: new Text("返回"), ), body: new Center( child: Text("静态路由可以传入一个routes参数来定义路由。但是这里定义的路由是静态的," "它不可以向下一个页面传递参数,利用push到一个新页面,pushNamed方法是有一个Future的返回值的" ",所以静态路由也是可以接收下一个页面的返回值的。但是不能向下一个页面传递参数"), ), ); } }

上述借助路由跳页过程中我们注意到,大概分以下几步:
1.注册路由且保证路由的唯一性
2.跳页时使用Navigator.of(context).pushNamed('路由地址');
3.使用Navigator.of(context).pop();结束当前页

2.静态路由跳页接收下一页的返回值

场景二:点击A页面上的按钮跳页到B页面,在B页面销毁后A页面接收到B页面回传回来的值并且显示在AlertDialog

效果图

Flutter入门进阶之旅(十三)Flutter 路由
静态路由回传数据

A页面代码:
使用Navigator push一个新页面,pushNamed方法是有一个Future的返回值的,在then回调中监听并接收新页面回传回来的数据,并且借助showDialog显示在Dialog

import 'package:flutter/material.dart'; import 'package:flutter_app/pages/simpleWidget/navigator/StaticNavigatorPageWithParams.dart'; void main() { runApp( new MaterialApp(home: new FlutterDemo(), routes: { 'router/new_page_with_callback': (_) => new StaticNavigatorPageWithResult() })); } class FlutterDemo extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("Flutter进阶之旅"), ), body: new Center( child: new RaisedButton( child: new Text("静态路由接收下一页返回值"), onPressed: () { Navigator.of(context) .pushNamed('router/new_page_with_callback') .then((value) { showDialog( context: context, child: new AlertDialog( content: new Text(value), )); }); })), ); } }

B页面代码:

从效果图中可以看到,当我点击B页面中间的按钮时会把数据回传给上一页,但是直接点击导航栏左上角的返回按钮回到A页面时并不会把数据传递给上一个页面,这里是因为我在B页面的按钮上pop页面出栈的时候把参数放进里面作为了参数传递,pop()可接收一个Object对象作为参数传递

Navigator.of(context).pop(T extends Object);

这就告诉我们当我们需要给上一个页面回传数据的时候可直接借助pop传递Navigator.of(context).pop("页面结束后返回的数据");,不需要传值的时候直接返回空对象Navigator.of(context).pop()即可。

import 'package:flutter/material.dart'; class StaticNavigatorPageWithResult extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("静态路由带返回参数"), ), body: new Center( child: new OutlineButton( onPressed: () { Navigator.of(context).pop("页面结束后返回的数据"); }, child: Text("点我返回上个页面结束后返回的数据"), ), ), ); } }

3.动态路由跳页

文章的开头我们提到借助动态路由可以向下一个页面传递参数,同样也可以接收新页面回传回来的数据。下面我模拟两个使用动态路由的场景,既然动态路由可以传值那就肯定可以不传值跳页,我就不模拟动态路由不传值跳页的例子了,读者借助静态路由的样例自行测试即可,我们主要讲解一下借助动态路由传值的例子。

场景三:点击A页面中的按钮,把用户名跟密码传递给下一个页面B页面,B页面处理完接收到的数据后把结果回传给A页面,A页面中把从B页面回传回来的数据显示在Dialog上。

模拟效果图

Flutter入门进阶之旅(十三)Flutter 路由
动态路由传递参数

使用动态路由时我们不再需要像静态路由那样在MaterialApp中的router中提前注册路由路径,只需要在使用Navigator.push传入MaterialPageRoute对象即可

Navigator.push( context, new MaterialPageRoute( //_代表参数为空 builder: (_) => new DynamicNaviattionPage( username: "xiedong", password: "123456", )));

A页面代码:

import 'package:flutter/material.dart'; import 'package:flutter_app/pages/simpleWidget/navigator/DynamicNavigationPage.dart'; void main() { runApp(new MaterialApp(home: new FlutterDemo())); } class FlutterDemo extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("Flutter进阶之旅"), ), body: new Center( child: new RaisedButton( onPressed: () { Navigator.push( context, new MaterialPageRoute( //_代表参数为空 builder: (_) => new DynamicNaviattionPage( username: "xiedong", password: "123456", ))).then((value) { showDialog( context: context, child: new AlertDialog( content: new Text(value), )); }); }, child: new Text("动态路由传参"), ))); } }

B页面代码:

import 'package:flutter/material.dart'; class DynamicNaviattionPage extends StatelessWidget { var username; var password; DynamicNaviattionPage({Key key, this.username, this.password}) : super(key: key); @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("动态路由"), ), body: new Center( child: new Column( children: [ new MaterialButton( onPressed: () { Navigator.pop(context, "未查询到改该用户信息"); }, child: new Text("点我返回"), color: Colors.lightGreen, ), new Text("上页传递过来的username $username"), new Text("上页传递过来的password $password"), ], ), ), ); } }

关于路由重点总结

  • Flutter路由分为静态路由跟动态路由,静态路由不支持向下一个页面传递参数,动态路由可传递
  • 静态路由使用时需要提前注册声明页面路径,
  • 动态路由可以直接在使用时构造路由对象,不需要提前注册路径。
  • 两种类型都支持接收下一页面回传回来的值

下一篇:Flutter入门进阶之旅(十四)ListView&GridView


推荐阅读
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
author-avatar
heishi86188
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有