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 相关文章推荐
源码解读Spring-Integration执行过程
Jun 11 Java/Android
Java框架入门之简单介绍SpringBoot框架
Jun 18 Java/Android
详解Java实现数据结构之并查集
Jun 23 Java/Android
新手初学Java List 接口
Jul 07 Java/Android
使用@Value值注入及配置文件组件扫描
Jul 09 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
SpringBoot中使用Redis作为全局锁示例过程
Mar 24 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Java版 简易五子棋小游戏
May 04 Java/Android
Java线程的6种状态与生命周期
May 11 Java/Android
Android Studio 计算器开发
May 20 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 session有效期问题
2009/04/26 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
一步步教你用Python实现2048小游戏
2017/01/19 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
Django如何将URL映射到视图
2019/07/29 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
淘宝客服专员岗位职责
2014/04/11 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
基层党支部整改方案
2014/10/25 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
考研导师推荐信范文
2015/03/27 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang