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中的OPTIONAL
Jun 14 Java/Android
浅谈Python魔法方法
Jun 28 Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 Java/Android
分析并发编程之LongAdder原理
Jun 29 Java/Android
java解析XML详解
Jul 09 Java/Android
Java移除无效括号的方法实现
Aug 07 Java/Android
JPA 通过Specification如何实现复杂查询
Nov 23 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
SpringCloud Function SpEL注入漏洞分析及环境搭建
Apr 08 Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 Java/Android
HttpClient实现文件上传功能
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
把77A收信机改造成收音机
2021/03/02 无线电
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
九步学会Python装饰器
2015/05/09 Python
详解K-means算法在Python中的实现
2017/12/05 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
Python装饰器用法实例分析
2019/01/14 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
ORACLE第二个十问
2013/12/14 面试题
就业自荐信
2013/12/04 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
企业宣传语大全
2015/07/13 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
《藏戏》教学反思
2016/02/23 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书