参考练习:https://book.flutterchina.club/chapter2/flutter_router.html

路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewController。所谓路由管理,就是管理页面之间如何跳转,通常也可被称为导航管理。这和原生开发类似,无论是Android还是iOS,导航管理都会维护一个路由栈,路由入栈(push)操作对应打开一个新页面,路由出栈(pop)操作对应页面关闭操作,而路由管理主要是指如何来管理路由栈。

我们VS Code创建Flutter应用时,默认的是一个计数器的例子,“计数器”示例的基础上,做如下修改:

flutter中的默认导航分成两种,一种是构建路由,一种是命名的路由。

构建路由

  1. 创建一个新路由,命名“NewRoute”
class NewRoute extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("New route"),),body: Center(child: Text("This is new route"),),);}
}

新路由继承自StatelessWidget,界面很简单,在页面中间显示一句"This is new route"。

  1. 在_MyHomePageState.build方法中的Column的子widget中添加一个按钮(FlatButton) :
Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[... //省略无关代码FlatButton(child: Text("open new route"),textColor: Colors.blue,onPressed: () {//导航到新路由   Navigator.push( context,new MaterialPageRoute(builder: (context) {return new NewRoute();}));},),],)

我们添加了一个打开新路由的按钮,并将按钮文字颜色设置为蓝色,点击该按钮后就会打开新的路由页面。

命名路由

所谓命名路由(Named Route)即给路由起一个名字,然后可以通过路由名字直接打开新的路由。这为路由管理带来了一种直观、简单的方式。

  1. 注册路由表

我们需要先注册路由表后,我们的Flutter应用才能正确处理命名路由的跳转。注册方式很简单,我们回到之前“计数器”的示例,然后在MyApp类的build方法中找到MaterialApp,添加routes属性,代码如下:

return new MaterialApp(title: 'Flutter Demo',theme: new ThemeData(primarySwatch: Colors.blue,),//注册路由表routes:{"new_page":(context)=>NewRoute(),} ,home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
  1. 通过路由名打开新路由页

接下来我们通过路由名来打开新的路由页,修改FlatButton的onPressed回调代码,改为

onPressed: () {Navigator.pushNamed(context, "new_page");//Navigator.push(context,//  new MaterialPageRoute(builder: (context) {//  return new NewRoute();//}));
},

热重载应用,再次点击“open new route”按钮,依然可以打开新的路由页。

构建路由传参

  1. 创建一个新的路由FirstScreen.如下: 参数$userName
// 构建路由传参
class FirstScreen extends StatelessWidget {final String userName;const FirstScreen({Key key, this.userName}) : super(key: key);@overrideWidget build(BuildContext context) {// 获取路由参数  print("路由传递过来的参数--- $userName");return Scaffold(appBar: AppBar(title: Text("FirstScreen"),),body: Center(child: Text("This is First Screen"),),);}
}
  1. 在打开路由时传递参数
//导航到新路由   Navigator.push( context,new MaterialPageRoute(builder: (context) {return new FirstScreen(userName:"Li peng");}));
  1. 热重载结果
flutter: 路由传递过来的参数--- Li peng

命名路由传参

  1. 在路由页通过RouteSetting对象获取路由参数
class NewRoute extends StatelessWidget {@overrideWidget build(BuildContext context) {//获取路由参数  var args=ModalRoute.of(context).settings.arguments;print("路由传递过来的参数--- $args");return Scaffold(appBar: AppBar(title: Text("New route"),),body: Center(child: Text("This is new route"),),);}
}
  1. 在打开路由时传递参数
Navigator.of(context).pushNamed("new_page", arguments: "hi");
  1. 热重载结果
Performing hot reload...                                               ⣽flutter: 路由传递过来的参数--- hi

这样两种传参都实现了!!! 但以上是由前先后传参的!

Navigator.pop 返回页面并传参

  1. 我们根据上面 构建路由传参的例子 : FirstScreen 路由修改来实现Navigator.pop 返回页面并传参:

在FirstScreen 页面增加一个按钮,用于出发 Navigator.pop 返回

// 构建路由传参
class FirstScreen extends StatelessWidget {final String userName;const FirstScreen({Key key, this.userName}) : super(key: key);@overrideWidget build(BuildContext context) {// 获取路由参数  print("路由传递过来的参数--- $userName");return Scaffold(appBar: AppBar(title: Text("FirstScreen"),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text("This is First Screen"),FlatButton(child: Text("open new route"),textColor: Colors.blue,onPressed: () {// 返回传参Navigator.pop(context, "我是回传参数,我带回了点好吃的给大家!!!");})],),),);}
}
  1. 在Navigator.push 的地方接受回传参数
                //导航到新路由   Navigator.push<String>(context, new MaterialPageRoute(builder: (BuildContext context){return new FirstScreen(userName:"请输入昵称");})).then( (String result){//处理代码 print("返回的回调---$result");});
  1. 热重载结果
Performing hot reload...
Reloaded 1 of 440 libraries in 158ms.
flutter: 路由传递过来的参数--- 请输入昵称
flutter: 返回的回调---我是回传参数,我带回了点好吃的给大家!!!

总结:实现了页面路由的跳转、从前向后传参、从后往前传参。

Flutter开发之路由跳转与传参(七)相关推荐

  1. 微信小程序开发:路由跳转以及传参的使用

    前言 微信小程序开发中的大部分知识点和前端开发是一模一样的,就算具体的语法不一样,但是套路都是一样的,可以说微信小程序开发和前端开发使用的知识点基本一致.本篇博文就来分享一下在微信小程序开发中必用的知 ...

  2. 11.14 尚品汇 day01 脚手架,路由命名,路由跳转,传参,props传参,重写push,replace

    less使用 npm i less npm i less-loader 安装easy less 1)要求 1.1:每一天老师书写代码务必三遍 1.2:node + webpack + VScode + ...

  3. vue中的路由跳转和传参

    一:注意:在 Vue 实例中,你可以通过 $router 访问路由实例.因此你可以调用 this.$router.push("路由地址")来跳转到目标路由页面: 想要导航到不同的 ...

  4. 【uniapp小程序】路由跳转navigator传参封装

    文章目录

  5. 微信小程序开发:学习笔记[8]——页面跳转及传参

    微信小程序开发:学习笔记[8]--页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...

  6. vue加载html传参,Vue页面跳转时传参总结

    1 路由跳转 &圈是的编小久据直请结未屏屏会气机页实应高lt;router-link   to="/login"&gt能调页代事求都学是功发解开宗这维视如间请前框来 ...

  7. Swift实战-豆瓣电台(六)视图跳转,传参及回跳

    原文:Swift实战-豆瓣电台(六)视图跳转,传参及回跳 youku观看地址:http://v.youku.com/v_show/id_XNzMxMzQ3MDcy.html 要点 在ChannelCo ...

  8. spring mvc controller间跳转 重定向 传参

    spring mvc controller间跳转 重定向 传参 1. 需求背景     需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形 ...

  9. flutter中的路由跳转

    在前面的基本路由和命名路由中,都演示了如何进行路由跳转,并且在路由跳转以后,可以借用系统自带的按钮就行返回上一级,当然了,也可以自定义按钮返回上一级. 返回上一级 在前面的例子中,当从Home.dar ...

最新文章

  1. Linux 创建、删除、修改 文件夹 文件命令(笔记)
  2. ffmpeg3.4 yuv编码为h264
  3. 使用javap分析Java的字符串操作
  4. iDempiere = OSGi + ADempiere 一款ERPCRMSCM系统、助力中小企业发展
  5. Android之moveTaskToBack()方法实现手动隐藏当前Activity
  6. 基于Pytorch的NLP入门任务思想及代码实现:判断文本中是否出现指定字
  7. leetcode350. 两个数组的交集 II
  8. 机器学习实战之K近邻算法
  9. python 减少可调用对象的参数个数
  10. 树莓派研发笔记三——搭建服务器和实践任务
  11. Unity3D脚印6——模型动画
  12. 重定向telnet方法
  13. java api cdm文档下载_Java-ORM数据库框架CDM介绍
  14. 【小白视角】大数据基础实践(二)Hadoop环境搭建与测试
  15. 对民办幼儿园管理的几点思考
  16. 龙卷风袭击广东致6死215伤 广州停
  17. 我与“萝卜坑”的点点滴滴
  18. mysql导入.idb文件进行修复数据库
  19. 白夜追凶 :手 Q 图片的显示和发送逻辑
  20. 成立5年仅有2款产品,“黑马”云鲸何以比肩石头、科沃斯?

热门文章

  1. 【12c新特性】12c中如何自动启动PDB Pluggable Database
  2. 创建github账号
  3. nginx 内核优化参数
  4. 教务查询子系统时序图
  5. Java SE7新特性之switch语句中使用字符串
  6. solaris下使用USB 海量存储设备
  7. wxPython的API下载
  8. MyBatis源码骨架分析
  9. mingw控制台中文乱码
  10. [bzoj4131]并行博弈_博弈论