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 相关文章推荐
Maven学习----Maven安装与环境变量配置教程
Jun 29 Java/Android
Spring Cloud Gateway去掉url前缀
Jul 15 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 Java/Android
Java 多态分析
Apr 26 Java/Android
Java 数组的使用
May 11 Java/Android
Java 死锁解决方案
May 11 Java/Android
Java中生成微信小程序太阳码的实现方案
Jun 01 Java/Android
springboot为异步任务规划自定义线程池的实现
Jun 14 Java/Android
Java完整实现记事本代码
Jun 16 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
volatile保证可见性及重排序方法
Aug 05 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
Zerg基本策略
2020/03/14 星际争霸
php像数组一样存取和修改字符串字符
2014/03/21 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
详解Django中的form库的使用
2015/07/18 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
Python正则表达式指南 推荐
2018/10/09 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
一篇.NET面试题
2014/09/29 面试题
会计主管岗位职责范文
2013/11/08 职场文书
新书吧创业计划书
2014/01/31 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA