Flutter Navigator路由传参的实现
作者:WEB前端李志杰 发布时间:2021-12-10 04:46:58
标签:Flutter,Navigator,路由传参
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("返回"),
),
);
}
}
来源:https://blog.csdn.net/qq_16221009/article/details/123347768


猜你喜欢
- 本文实例为大家分享了Java实现双向链表的具体代码,供大家参考,具体内容如下双向链表与单链表的对比:1、单向链表查找只能是一个方向,双向链表
- 文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并。很多高大上的分布式文件系统(比如:google
- 第一部分代码(实体类)package com.wf.entity;public class Hehe{private int hehe_id
- 本文实例为大家分享了Android自定义带圆点的半圆形进度条,供大家参考,具体内容如下仅限用于半圆形,如须要带圆点的圆形进度条,圆点会出现错
- 前言相信大家在Android日常开发中,绘制圆形和绘制图片都是很容易的事情,但是绘制圆形图片就有点难倒人了。以前为了偷懒就直接去github
- 在popupWindow里面再弹出popupWindow的时候会报这样的错误ERROR/AndroidRuntime(888): andro
- 在Activity 添加即可getWindow().addFlags(WindowManager.LayoutParams.FLAG_SEC
- ??是一个二元运算符,如果左操作数非空,则返回左操作数,否则返回右操作数,所以,在一些特定的场合可以用它来代替?:运算符,简化代码书写。例1
- 1.背景可以使用mybatis-plus-generator逆向生成dao层、service层、controller层等代码2.引入jar包
- 一.并行LINQSystem.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上。尽管E
- 在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,Spring就可以自动帮我们进行事务的开启、提交、
- JDBC Statement对象实例以下是利用以下三种查询以及打开和关闭说明的例子:boolean execute(String SQL)
- 简介:本文将帮助您使用 Spring Boot 创建简单的 REST 服务。你将学习什么是 REST 服务?如何使用 Spring Init
- .net core提供了Json处理模块,在命名空间System.Text.Json中,下面通过顶级语句,对C#的Json功能进行讲解。序列
- 本文汇总了android 8种对话框(Dialog)使用方法,分享给大家供大家参考,具体内容如下1.写在前面Android提供了丰富的Dia
- Android 中倒计时验证两种常用方式实例详解短信验证码功能,这里总结了两种常用的方式,可以直接拿来使用。看图:说明:这里的及时从10开始
- 最近这款“跳一跳”很火,在段子里面看到有人才放了张画着坐标的纸在手机上,说根据
- //Main:using System;using System.Collections.Generic;using System.Linq
- 1. 配置 * 具体步骤:编写一自定义 * 类实现接口 HandlerInterceptorHandlerInterceptor 接口: 可
- URL(Uniform Resource Locator)是统一资源 * ,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,