flutter:如何实现局部导航管理?

news2024/11/27 14:27:20

引言

今天,小编给大家分享如何在 flutter 中实现 ‘局部导航’。开始之前我们先来统一一下关于 局部导航 的概念。

局部导航是什么?

我们在 flutter 中使用 navigator 来管理 app 的页面堆栈,主要包括 push、pop 这两种操作。而当我们UI设计划分得更细致时,可能遇到需要在某个独立页面里,单独维护一套子级的堆栈管理。这就叫 局部导航管理

局部控件内单独维护局部范围内的堆栈管理的形式有很多,例如:

  • 形式一: 左侧是菜单栏,右侧是内容块,在内容块中单独维护局部的页面push、pop、操作。
  • 形式二:dialog 弹窗中单独维护布局堆栈管理。

那么下面,小编使用 dialog 的形式来分享实现过程。

实现步骤

第一步

创建工具类,用于局部导航管理,思想是:将需要单独进行堆栈管理的页面使用新的子级 navigator 进行包裹,单独维护一个 navigator,做到每个堆栈容器实现内部各自管理。

///工具类:用于局部导航管理
class LocalNavigator extends StatelessWidget {final Widget child;const LocalNavigator(this.child, {Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Navigator(initialRoute: '/',onGenerateRoute: (settings) {return MaterialPageRoute(settings: const RouteSettings(name: '/'),builder: (context) {return child;},);},);}
} 

第二步

如上 demo 示例,实现一个单独堆栈管理的弹窗内部,对弹窗方法进行封装处理。

showDialog 时使用我们封装的工具类 LocalNavigator 作为父节点,对具体子页面节点进行包裹。

那么子页面内的堆栈操作(push 、pop、)都会在我们的 LocalNavigator 堆栈中响应。

/// 通过局部导航开启一个弹窗static Future<T?> showLocalDialog<T>(BuildContext context,Widget child,) {return showDialog<T?>(context: context,builder: (context) {return Dialog(child: SizedBox(width: 200,height: 300,child: LocalNavigator(child),),);},);} 

第三步

弹出 dialog,附上 demo 样例的完整代码

void main() {runApp(const Material(child: MyApp(),));
}

class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('demo'),),body: StatefulBuilder(builder: (context, setState) {return Center(child: TextButton(child: const Text('打开弹窗'),onPressed: () { showLocalDialog<String?>(context, const _PageA()).then((data) {//接收来自 dialog 的回调数据if (data != null) {Fluttertoast.showToast(msg: 'mainPage 接收数据:$data');}},);},),);},),),);}
}

class _PageA extends StatelessWidget {const _PageA({Key? key}) : super(key: key);void jumpPageB(BuildContext context) {Navigator.push<String?>(context,MaterialPageRoute(builder: (context) => const _PageB(),),).then((data) {if (data != null) {//接收来自 pageB 的回调数据Fluttertoast.showToast(msg: 'pageA 接收数据:$data');}},);}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('PageA')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [TextButton(onPressed: () {jumpPageB(context);},child: const Text('跳转页面B'),),],),),);}
}

class _PageB extends StatelessWidget {const _PageB({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('PageB')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [TextButton(onPressed: () {Navigator.of(context).pop('我是来自pageB的数据');},child: const Text('返回pageA'),),const SizedBox(height: 20),TextButton(onPressed: () {Navigator.of(context, rootNavigator: true).pop('我是来自pageC的数据');},child: const Text('关闭整个弹窗'),),],),),);}
} 

技术点分析:

1. 局部 Navigator 管理重点

需要维护局部堆栈关系的子节点 进行嵌套,使用自定义的工具类 LocalNavigator 作为父节点。

2. 返回上一级页面,与关闭整个弹窗怎么区分?

关键点在于 Navigator.of(context) 中的 rootNavigator 可选入参,默认是不使用根节点下的 navigator。

  • 返回上一级页面,使用当前的堆栈进行操作 Navigator.of(context).pop()
  • 关闭整个弹窗,意味着在根堆栈进行 pop 操作 Navigator.of(context, rootNavigator: true).pop()

3. 如何接收页面关闭时回传的数据?

  • 关闭时通过 pop() 方法进行数据回传 Navigator.of(context).pop(data)
  • 接收回传数据,在打开新堆栈的 push 方法中接收回返回值 Navigator.push<T?>(context, route).then((T){ }) T 为返回值的泛型标识,注意在接收处理的地方需要对返回值进行判空操作
Navigator.push<String?>(context,MaterialPageRoute(builder: (context) => const _PageB(),),).then((data) {if (data != null) {//接收来自 pageB 的回调数据Fluttertoast.showToast(msg: 'pageA 接收数据:$data');}},); 

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gitee实现项目托管

一、下载git官网链接&#xff1a;Git - Downloads安装参考:https://blog.csdn.net/weixin_44950987/article/details/102619708二、登录gitee&#xff08;码云&#xff09;&#xff0c;添加SSH公钥2.1、生成SSH公钥过程2.2、打开刚刚下载的git 然后跟着步骤来&#xff1a;2.3、…

C程序设计教程(02)—— 概述部分练习题

C程序设计教程&#xff08;02&#xff09;—— 概述部分练习题 一、填空题 1、结构化程序设计采用顺序结构、&#xff08;分支结构或选择结构&#xff09;和循环结构等三种基本结构编写程序。 2、程序由&#xff08;一个或多个函数&#xff09;组成&#xff0c;其中必须有且…

2.ISAAC 环境配置

ISAAC 环境配置 本文档介绍了如何开始使用 Isaac SDK 和 Isaac Sim 进行开发。 完成本文档中的步骤后&#xff0c;您应该准备好开始使用 Isaac SDK 开发机器人应用程序。 预安装 Isaac 目前仅支持 Ubuntu 18.04 LTS 从您的工作站进行开发和模拟。 请确保在您的工作站上安装最…

机器学习记录

概念辨析&#xff1a; 人工智能包含机器学习&#xff0c;机器学习包含深度学习 机器学习 机器学习约等于&#xff1a;looking for Function 深度学习&#xff1a;Function就是一个类神经网络 如果输出是一个数值就就叫回归 如果输出是几种类别就是分类 自监督学习为机器学习…

逻辑漏洞渗透与攻防(四)之任意账号注册

目录 任意账号注册 未验证邮箱/手机号 批量注册 个人信息伪造 前端验证审核绕过 邮箱/手机号注册激活验证绕过 用户名覆盖 任意账号注册 未验证邮箱/手机号 未验证邮箱/手机号&#xff0c;目前很多应用为了方便用户记录自己的用户名与密码&#xff0c;都可以使用邮箱…

【Spring6核心源码系列】IOC之BeanDefinition的封装

哎呀&#xff0c;又是午夜时分&#xff0c;又是一个失眠的夜晚&#xff0c;和去年一样&#xff0c;记得去年今日&#xff0c;也是睡不着觉&#xff0c;就注册了csdn的账号&#xff0c;开始写东西&#xff0c;csdn真是深夜最好的安魂剂。 Spring都发布了6.0&#xff0c;这不赶紧…

什么是JSP,JSP的运行原理是什么?

在动态Web项目的开发中&#xff0c;经常需要动态生成HTML。内容(如系统中的当前在线人数需要动态生成)。如果使用Servlet实现HTML页面数据的统计&#xff0c;则需要使用大量的输出语句。同时&#xff0c;如果静态内容和动态内容混合在一起&#xff0c;那么也将导致程序非常臃肿…

Bandit算法学习[网站优化]03——Softmax 算法

Bandit算法学习[网站优化]03——Softmax 算法 参考资料 White J. Bandit algorithms for website optimization[M]. " O’Reilly Media, Inc.", 2013.https://github.com/johnmyleswhite/BanditsBook 实验环境&#xff1a;jupyter python 3.7 项目地址&#xff1…

【实践】百度APP Feed流业务架构变迁思考和升级实践

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿《底层逻辑》高清配图‍基于深度学习的个性化推荐系统实时化改造与升级.pdf推荐技术在vi…

图像数字识别、数字分割(OCR识别,毕业设计)

基本图像处理流程 这是我在测试图像处理中使用的原始图像。它有一些眩光点&#xff0c;但是图像相当干净。让我们逐步完成获取此源图像的过程&#xff0c;并尝试将其分解为单个数字。 影像准备 在开始图像处理流程之前&#xff0c;我们决定先调整一些图像属性&#xff0c;然后…

【数据结构】LeetCode升级版的环形链表,复制带随机指针的链表

目录 一、升级版的环形链表 1、题目说明 2、题目解析 二、复制带随机指针的链表 1、题目说明 2、题目解析 一、升级版的环形链表 1、题目说明 题目链接&#xff1a;升级版的环形链表 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&am…

桌面客户端性能提升,优化使用资源消耗

十二月末&#xff0c;MQTT X 团队发布了 1.9.1-beta.1 版本&#xff0c;这也是 MQTT X 的首个公共测试版。我们希望能够通过测试版本&#xff0c;让更多用户参与到 MQTT X 的测试中来&#xff0c;和我们一起打造一个更加稳定的版本&#xff0c;进而帮助用户轻松使用 MQTT X 完成…

LabVIEW传递接收C/C++DLL指针

LabVIEW传递接收C/CDLL指针传递指针C和C函数通常在其函数原型中接收指针。指针基本上是一个表示内存地址的整数值。要将指向DLL的指针&#xff08;即值的内存地址&#xff09;从LabVIEW传递到DLL&#xff0c;必须配置调用库函数节点&#xff0c;以通过引用而不是值传递数据。不…

【Linux】vim文本编辑器的使用

目录 一、为什么要学vim 1.原因 2.简单介绍 3.准备工作 二、vim最小集 1.各模式功能 2.编写代码示例 三、vim指令集 1.命令模式 1.1光标移动 1.2复制&#xff08;剪切&#xff09;粘贴 1.3 撤销 1.4 替换 / 删除/大小写切换 2.底行模式 2.1本文件内操作 2.2文件…

KITTI数据集可视化(二):点云多种视图与标注展示的可视化代码解析

如有错误&#xff0c;恳请指出。 文章目录1. 在图像上绘制2d、3d标注框2. 在图像上绘制Lidar投影3. Lidar绘制前视图(FOV)4. Lidar绘制前视图(FOV)3d box5. Lidar绘制鸟瞰图(BEV)6. Lidar绘制鸟瞰图(BEV)2d box7. Lidar绘制全景图(RV)8. Lidar绘制全景图(RV)2d box在对KITTI数据…

立创eda专业版学习笔记(2)(从原理图导入变更失败)

出师不利啊&#xff0c;刚想把用一个原理图生成pcb板就出来这个&#xff0c;第一眼我是有点懵的。后来发现其实是我没搞清楚软件的基本逻辑。 原本&#xff0c;在一个板子的下面有一个原理图&#xff0c;原理图有1页&#xff0c;图标是这个样子 我本来是想新建一个pcb板&#x…

Spring MVC 返回数据

默认请求下⽆论是 Spring MVC 或者是 Spring Boot 返回的是视图&#xff08;xxx.html&#xff09;&#xff0c;⽽现在都是前后端分离的&#xff0c;后端只需要返回给前端数据即可&#xff0c;这个时候我们就需要使⽤ResponseBody 注解了。 1.返回静态界面 创建前端页面index.…

spring boot配置多数据源(静态和动态数据源)

背景在开发过程中&#xff0c;很多时候都会有垮数据库操作数据的情况&#xff0c;需要同时配置多套数据源&#xff0c;即多个数据库&#xff0c;保证不同的业务在不同的数据库执行操作&#xff0c;通过mapper来灵活的切换数据源。本文以sqlserver和mysql混合数据源配置为例。配…

美团开放平台SDK自动生成技术与实践

总第549篇2023年 第001篇美团开放平台为整个美团提供了20业务场景的开放API&#xff0c;为了使开发者能够快速且安全的接入美团开放平台&#xff0c;美团开放平台提供了多种语言的SDK来提高开发者的接入效率。本文介绍了美团开放平台如何自动生成SDK代码的相关技术实现方案&…

【学习】深度强化学习、模型压缩

文章目录一、deep reinforcement learningPolicy-based Approach——Learning an Actor作为actor的神经网络small model网络可以被修剪一、deep reinforcement learning 强化学习场景 监督学习和强化学习之间&#xff1a; 训练一个聊天机器人-强化学习&#xff1a;让两个代…