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中bean的生命周期之getSingleton方法
Jun 30 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
SpringBoot中使用Redis作为全局锁示例过程
Mar 24 Java/Android
Android Rxjava3 使用场景详解
Apr 07 Java/Android
详细介绍Java中的CyclicBarrier
Apr 13 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
Java界面编程实现界面跳转
Jun 16 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 Java/Android
Spring Boot 的创建和运行示例代码详解
Jul 23 Java/Android
OpenFeign实现远程调用
Aug 14 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 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
旅游管理专业个人求职信范文
2013/12/24 职场文书
人事任命书怎么写
2014/06/05 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
签证工作证明模板
2015/06/15 职场文书
太空授课观后感
2015/06/17 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
opencv读取视频并保存图像的方法
2021/06/04 Python