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 相关文章推荐
正则表达式拆分url实例代码
Feb 24 Java/Android
SpringBoot2零基础到精通之异常处理与web原生组件注入
Mar 22 Java/Android
Android超详细讲解组件ScrollView的使用
Mar 31 Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 14 Java/Android
Java版 单机五子棋
May 04 Java/Android
Java实现扫雷游戏详细代码讲解
May 25 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
Jun 21 Java/Android
Java 多线程并发FutureTask
Jun 28 Java/Android
Android RecyclerView实现九宫格效果
Jun 28 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 Java/Android
MyBatis XPathParser解析器使用范例详解
Jul 15 Java/Android
Android移动应用开发指南之六种布局详解
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中常用的预定义变量小结
2012/05/09 PHP
php Calender(日历)代码分享
2014/01/03 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
vue实现动态按钮功能
2019/05/13 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
python为tornado添加recaptcha验证码功能
2014/02/26 Python
python写xml文件的操作实例
2014/10/05 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
python的格式化输出(format,%)实例详解
2018/06/01 Python
python执行精确的小数计算方法
2019/01/21 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
Python的垃圾回收机制详解
2019/08/28 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
教师实习期自我鉴定
2013/10/06 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
业务员岗位职责
2015/02/03 职场文书
七年级作文之英语老师
2019/10/28 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
python 详解turtle画爱心代码
2022/02/15 Python