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实践之建造者模式
Jun 18 Java/Android
Java循环队列与非循环队列的区别总结
Jun 22 Java/Android
Spring boot应用启动后首次访问很慢的解决方案
Jun 23 Java/Android
详解Java线程池是如何重复利用空闲线程的
Jun 26 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
Sep 25 Java/Android
Spring Data JPA框架的核心概念和Repository接口
Apr 28 Java/Android
Spring 使用注解开发
May 20 Java/Android
SpringBoot详解执行过程
Jul 15 Java/Android
SpringBoot Http远程调用的方法
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
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
JS的get和set使用示例
2014/02/20 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
Python Sleep休眠函数使用简单实例
2015/02/02 Python
Python下载指定页面上图片的方法
2016/05/12 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
python输出带颜色字体实例方法
2019/09/01 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
国培计划培训感言
2014/03/11 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
项目投资意向书
2014/04/01 职场文书
低碳生活倡议书
2014/04/14 职场文书
教师读书活动总结
2014/05/07 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
社区党建工作总结2015
2015/05/13 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python
React更新渲染原理深入分析
2022/12/24 Javascript