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中重写父类方法加不加@Override详解
Jun 21 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
spring boot项目application.properties文件存放及使用介绍
Jun 30 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
Java异常处理try catch的基本用法
Dec 06 Java/Android
Java 获取Word中所有的插入和删除修订的方法
Apr 06 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Apr 26 Java/Android
mybatis 获取更新记录的id
May 20 Java/Android
spring IOC容器的Bean管理XML自动装配过程
May 30 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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
jquery select操作的日期联动实现代码
2009/12/06 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
python实现简单flappy bird
2018/12/24 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
祖国在我心中演讲稿300字
2014/05/04 职场文书
诉前财产保全担保书
2014/05/20 职场文书
本科应届生自荐信
2014/06/29 职场文书