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中Collection的一些常用方法总结
Jun 13 Java/Android
Java多条件判断场景中规则执行器的设计
Jun 26 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Elasticsearch 配置详解
Apr 19 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
java版 简单三子棋游戏
May 04 Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
Jun 01 Java/Android
Java实现简单小画板
Jun 10 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
Java获取字符串编码格式实现思路
Sep 23 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
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
基于PHP输出缓存(output_buffering)的深入理解
2013/06/13 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
jQuery live
2009/05/15 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
浅析Git版本控制器使用
2017/12/10 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Python if语句知识点用法总结
2018/06/10 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
python实现多进程代码示例
2018/10/31 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
python实现取余操作的简单实例
2020/08/16 Python
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
加热夹克:RAVEAN
2018/10/19 全球购物
求网格中的黑点分布
2013/11/06 面试题
教师学习三严三实心得体会
2014/10/13 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
综合素质自我评价评语
2015/03/06 职场文书
教师培训简讯
2015/07/20 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers