Flutter Navigator 实现路由传递参数


Posted in Java/Android onApril 22, 2022

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

一、命名路由传参

应用入口处定义路由表

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false, // 隐藏预览中的debug
      title: 'Flutter Demo',
      routes: {
        '/': (context) => const HomePage(),
        "menu": (context) => const MenuPage()
      },
    );
  }
}
// 定义HomePage
class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("登录"),
      ),
      body: ElevatedButton(
        onPressed: () async {
          // 实现路由跳转
          var result = await Navigator.pushNamed(context, 'menu',
              arguments: {'name': 'title'});
          print(result);
        },
        child: const Text('登录'),
      ),
    );
  }
}
// 定义MenuPage
class MenuPage extends StatelessWidget {
  const MenuPage({Key? key}) : super(key: key);
  @override
  // 接收传参
  Widget build(BuildContext context) {
    dynamic argumentsData = ModalRoute.of(context)?.settings.arguments;
    return Scaffold(
      appBar: AppBar(
        title: Text('菜单' + argumentsData.toString()),
      ),
      body: ElevatedButton(
        onPressed: () {
          Navigator.pop(context, {'name': "Navigator.pop传参"});
        },
        child: const Text("返回"),
      ),
    );
  }
}

二、构建路由传参

从HomePage页面跳转MenuPage页面时,携带参数

第一种方式:

// 定义HomePage
class HomePage extends StatelessWidget {
  const HomePage ({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("登录"),
      ),
      body: ElevatedButton(
        onPressed: () {
          // 实现路由跳转
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => const MenuPage(
                title: '菜单123',
              ), // 需要跳转的页面
            ), // 修改路由的名称、信息等
          );
        },
        child: const Text('登录'),
      ),
    );
  }
}
// 定义MenuPage
class MenuPage extends StatelessWidget {
  // 定义接收的字段
  final String title;
  const MenuPage({Key? key, required this.title}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: ElevatedButton(
        onPressed: () {
          Navigator.pop(context);
        },
        child: const Text("返回"),
      ),
    );
  }
}

第二种方式:

// 定义HomePage
class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("登录"),
      ),
      body: ElevatedButton(
        onPressed: () {
          // 实现路由跳转
          Navigator.push(
            context,
            MaterialPageRoute(
                builder: (context) => const MenuPage(),
                // 修改路由的名称、信息等
                settings: const RouteSettings(
                    name: '菜单', arguments: {"name": '123'}) // 需要跳转的页面
                ),
          );
        },
        child: const Text('登录'),
      ),
    );
  }
}
// 定义MenuPage
class MenuPage extends StatelessWidget {
  const MenuPage({Key? key}) : super(key: key);
  @override
  // 接收传参
  Widget build(BuildContext context) {
    dynamic argumentsData = ModalRoute.of(context)?.settings.arguments;
    return Scaffold(
      appBar: AppBar(
        title: Text('菜单' + argumentsData.toString()),
      ),
      body: ElevatedButton(
        onPressed: () {
          Navigator.pop(context);
        },
        child: const Text("返回"),
      ),
    );
  }
}

从MenuPage页面返回HomePage页面时,携带参数

// 定义HomePage
class HomePage extends StatelessWidget {
  const HomePage ({Key? key}) : super(key: key);;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("登录"),
      ),
      body: ElevatedButton(
        onPressed: () async {
          // 实现路由跳转
          var result = await Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => const MenuPage(),
            ),
          );
          print(result);
        },
        child: const Text('登录'),
      ),
    );
  }
}
// 定义MenuPage
class MenuPage extends StatelessWidget {
  const MenuPage({Key? key}) : super(key: key);
  @override
  // 接收传参
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('菜单'),
      ),
      body: ElevatedButton(
        onPressed: () {
          Navigator.pop(context, {'name': "Navigator.pop传参"});
        },
        child: const Text("返回"),
      ),
    );
  }
}

到此这篇关于Flutter Navigator路由传参的实现的文章就介绍到这了!


Tags in this post...

Java/Android 相关文章推荐
详解Java实践之建造者模式
Jun 18 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
mybatis中sql语句CDATA标签的用法说明
Jun 30 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
看完这篇文章获得一些java if优化技巧
Jul 15 Java/Android
springboot 多数据源配置不生效遇到的坑及解决
Nov 17 Java/Android
maven依赖的version声明控制方式
Jan 18 Java/Android
Java 数据结构七大排序使用分析
Apr 02 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
Jun 14 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Java设计模式之代理模式
Apr 22 #Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 #Java/Android
Spring Boot接口定义和全局异常统一处理
Apr 20 #Java/Android
Spring Boot配合PageHelper优化大表查询数据分页
Java Spring Boot 正确读取配置文件中的属性的值
Elasticsearch Recovery 详细介绍
Apr 19 #Java/Android
You might like
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
express.js中间件说明详解
2019/03/19 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
python3简单实现微信爬虫
2015/04/09 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
python excel和yaml文件的读取封装
2021/01/12 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
2014年健康教育实施方案
2014/02/17 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
python代码实现备忘录案例讲解
2021/07/26 Python
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android