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 相关文章推荐
解决SpringBoot跨域的三种方式
Jun 26 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
Jun 27 Java/Android
elasticSearch-api的具体操作步骤讲解
Jun 28 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Java虚拟机内存结构及编码实战分享
Apr 07 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
Apr 08 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
SpringBoot全局异常处理方案分享
May 25 Java/Android
Java界面编程实现界面跳转
Jun 16 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小偷程序)
2014/08/23 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
jquery编写日期选择器
2017/03/16 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
浅谈python标准库--functools.partial
2019/03/13 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
python mysql断开重连的实现方法
2019/07/26 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
村党支部换届选举方案
2014/05/02 职场文书
校园文明倡议书
2014/05/16 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS