当前位置: 首页 > news >正文

flutter鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态

在 Flutter 中,状态管理是开发过程中一个至关重要的部分。Flutter 提供了多种方式来实现组件间的状态传递,其中一种比较底层的方式是使用 InheritedWidget。虽然 InheritedWidget 主要用于将数据传递给其子树中的小部件,但它也是许多更高级状态管理解决方案(如 Provider)的基础。本文将详细介绍如何使用 InheritedWidget 来实现跨 Widget 的状态传递。

1. InheritedWidget 基础介绍

InheritedWidget 是 Flutter 框架提供的一个特殊 Widget,它允许数据在 Widget 树中向下传递。当一个 Widget 需要跨越多个子 Widget 传递数据时,可以将数据保存在 InheritedWidget 中,并让它作为一个数据的容器。所有依赖于这个 InheritedWidget 的子 Widget,都能方便地获取到这些数据。

InheritedWidget 的工作原理

  • InheritedWidget 主要依赖 of 方法来从 Widget 树的不同位置读取数据。
  • InheritedWidget 会在其 child 发生变化时触发树重建。这意味着它不仅可以传递数据,还能在数据发生变化时自动更新界面。

2. 示例代码:实现一个简单的计数器

为了让大家更清楚地理解 InheritedWidget 的使用,我们通过实现一个简单的计数器来展示它是如何跨 Widget 传递状态的。

完整代码

import 'package:flutter/material.dart';// 1. 创建一个 InheritedWidget,用于传递状态
class CounterInheritedWidget extends InheritedWidget {final int counter;final Function() increment;CounterInheritedWidget({Key? key,required this.counter,required this.increment,required Widget child,}) : super(key: key, child: child);// 创建一个方法,方便其他组件获取到当前的 CounterInheritedWidget 实例static CounterInheritedWidget of(BuildContext context) {final result = context.dependOnInheritedWidgetOfExactType<CounterInheritedWidget>();assert(result != null, 'No CounterInheritedWidget found in context');return result!;}@overridebool updateShouldNotify(CounterInheritedWidget oldWidget) {// 当 counter 发生变化时,通知子 Widget 进行更新return counter != oldWidget.counter;}
}// 2. 创建一个使用 CounterInheritedWidget 的页面
class CounterPage extends StatelessWidget {@overrideWidget build(BuildContext context) {// 获取状态数据final counter = CounterInheritedWidget.of(context).counter;final increment = CounterInheritedWidget.of(context).increment;return Scaffold(appBar: AppBar(title: Text('InheritedWidget Counter')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('Counter Value: $counter', style: TextStyle(fontSize: 30)),SizedBox(height: 20),ElevatedButton(onPressed: increment,child: Text('Increment'),),],),),);}
}// 3. 创建一个 StatefulWidget 来管理数据并使用 CounterInheritedWidget
class CounterApp extends StatefulWidget {@override_CounterAppState createState() => _CounterAppState();
}class _CounterAppState extends State<CounterApp> {int _counter = 0;// 增加计数void _incrementCounter() {setState(() {_counter++;});}@overrideWidget build(BuildContext context) {return CounterInheritedWidget(counter: _counter,increment: _incrementCounter,child: CounterPage(),);}
}void main() {runApp(MaterialApp(home: CounterApp()));
}

代码解释

1. CounterInheritedWidget 类

CounterInheritedWidget 是继承自 InheritedWidget 的自定义类,它将计数器的值和 increment 方法封装在其中。这个 Widget 会被用来向下传递数据(在这里是计数器的值和一个函数)。

  • 构造函数:接收 counter(计数器的值)、increment(增加计数的函数)和 child(需要显示的子组件)。
  • of 方法:是一个静态方法,用于从 BuildContext 获取到最近的 CounterInheritedWidget 实例。它会从当前上下文的 InheritedWidget 树中向上查找,找到最近的 CounterInheritedWidget 并返回。
  • updateShouldNotify 方法:当 CounterInheritedWidget 的 counter 值变化时,返回 true,通知 Widget 树的依赖此 Widget 的所有子 Widget 重新构建。
2. CounterPage 页面

CounterPage 是显示计数器值的页面,它通过 CounterInheritedWidget.of(context) 来获取 counterincrementincrement 是一个回调函数,用来更新计数器的值,counter 是计数器的当前值。

3. CounterApp 类

CounterApp 是一个 StatefulWidget,负责管理计数器的状态。它的 build 方法返回一个 CounterInheritedWidget,并将 _counter_incrementCounter 传递给它。这个 Widget 作为根 Widget 包裹 CounterPage,让计数器的值和方法能够通过 InheritedWidget 传递给页面中的所有子 Widget。

4. 启动应用

main 方法启动应用,设置 CounterApp 为根 Widget。CounterApp 会初始化计数器的状态并通过 CounterInheritedWidget 传递给 CounterPage,使得子 Widget 可以访问和更新状态。

3. 如何工作?

  • CounterInheritedWidget 将 counter 和 increment 方法传递给其子树中的 CounterPage
  • CounterPage 通过 CounterInheritedWidget.of(context) 方法获取 CounterInheritedWidget 实例,从而访问 counter 和 increment
  • 当按下 "Increment" 按钮时,_incrementCounter 被调用,导致 setState 被触发,_counter 的值更新。由于 CounterInheritedWidget 中的 counter 值发生变化,它会通知所有依赖它的 Widget 重新构建。最终,CounterPage 重新渲染,显示更新后的计数器值。

4. 小结

使用 InheritedWidget 可以让我们方便地将数据传递到 Widget 树的深层。它的优势在于:

  • 提供了一种高效、性能优化的状态传递方式。
  • 可以在多层嵌套的 Widget 中传递数据,避免了通过 setState 或回调的层层传递。

虽然 InheritedWidget 功能强大,但它的使用较为底层,Flutter 也提供了 Provider 等更高级的状态管理工具,可以在更复杂的应用中提供更加灵活和简洁的状态管理方案。

相关文章:

flutter鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态

在 Flutter 中&#xff0c;状态管理是开发过程中一个至关重要的部分。Flutter 提供了多种方式来实现组件间的状态传递&#xff0c;其中一种比较底层的方式是使用 InheritedWidget。虽然 InheritedWidget 主要用于将数据传递给其子树中的小部件&#xff0c;但它也是许多更高级状…...

计算机的错误计算(一百四十六)

摘要 探讨 MATLAB 中正切函数 tan(x)、余切函数 cot(x) 关于 附近数的计算精度问题。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 -0.7837941516239115e10、-0.1275845192169577e-9、0.4782331334117711e7 与 0.2091030357653982e-…...

国标GB28181视频平台EasyCVR私有化视频平台工地防盗视频监控系统方案

一、方案背景 在当代建筑施工领域&#xff0c;安全监管和防盗监控是保障工程顺利进行和资产安全的关键措施。随着科技进步&#xff0c;传统的监控系统已不足以应对现代工地的安全挑战。因此&#xff0c;基于国标GB28181视频平台EasyCVR的工地防盗视频监控系统应运而生&#xf…...

CUDA系统学习之一软件堆栈架构

一、CPU与GPU体系架构 计算单元分布 CPU: 少量强大的ALU(算术逻辑单元)&#xff0c;通常4-8个核心GPU: 大量小型ALU&#xff0c;成百上千个计算核心特点&#xff1a;GPU更适合并行计算&#xff0c;可以同时处理大量数据控制单元(Control) CPU: 较大的控制单元&#xff0c;复杂的…...

SpringBoot项目中替换指定版本的tomcat

需求&#xff1a;项目使用的SpringBoot框架&#xff0c;因低版本的tomcat的有安全漏洞&#xff0c;根据安全要求需要将项目的tomcat版本升级到9.0.89以上版本。 解决办法&#xff1a; 1、在pom.xml中排除SpringBoot的默认tomcat依赖&#xff1b; <dependency><groupId…...

【5.10】指针算法-快慢指针将有序链表转二叉搜索树

一、题目 给定一个单链表&#xff0c;其中的 元素按升序排序 &#xff0c;将其转换为 高度平衡的二叉搜索树 。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表&#xff1a; [ -10 , -3 , 0 , …...

机器学习—前向传播的一般实现

可以写一个函数来实现一个密集的层&#xff0c;那是神经网络的单层&#xff0c;所以定义稠密函数&#xff0c;它将上一层的激活作为输入以及给定层神经元的参数w和b。看下边图片所展示的例子&#xff0c;把所有这些权重向量堆叠成一个矩阵&#xff0c;wnp.array([[1,-3,5][2,4,…...

极狐GitLab 签约足下科技,加速国产智驾操作系统的发展与普及

客户背景 足下科技是一家致力于成为智能汽车软件平台、产品与服务领导者的高科技企业&#xff0c;成立于 2022年 3 月&#xff0c;总部位于深圳市。足下科技自主研发的智能驾驶操作系统 Earth 和 Air 工具链&#xff0c;协助OEM和Tier1厂商降低算法和软件开发难度&#xff0c;…...

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N 2024/11/2 18:04 在WIN10使用程序&#xff1a;ViewLink-4.0.7_0708-windows-x64.exe 在荣品PRO-RK3566开发板的预置Android13下使用&#xff1a;ViewLink-2023_12_21-release-0.2.6.apk adb install…...

力扣(leetcode)题目总结——哈希表篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…...

AWS RDS Oracle hit ORA-39405

报错信息&#xff1a; ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version 42 into a target database with TSTZ version 35. 分析过程&#xff1a; 这个报错是由于timezone_file的版本&#xff0c;源端比目标端高&#xf…...

Dinky中配置Flink集群

需要启动yarn-session 进程&#xff0c;在集群服务器 cd /pwd//flink/bin yarn-session -d 启动成功后可以在yarn的资源管理队列进行查看 启动成功后会给出&#xff1a;JobManager Web Interface 在dinky中进行配置&#xff1a; 集群配置 Hadoop 配置&#xff1a; H…...

通讯录(C 语言)

目录 一、通讯录设计思路1. 伪代码设计思路2. 代码设计思路 二、代码实现三、程序运行演示四、整体分析 一、通讯录设计思路 1. 伪代码设计思路 通讯录可以用来存储 100 个人的信息&#xff0c;每个人的信息包括&#xff1a;姓名、性别、年龄、电话、住址。 提供方法&#x…...

对比Java和TypeScript中的服务注册和查找机制

文章目录 一、Java中的服务注册和查找二、TypeScript中的服务注册和查找2.1 使用依赖注入&#xff08;DI&#xff09;框架2.2 injectable原理2.3 使用TypeScript的反射系统实现依赖注入 三、优缺点分析3.1 Java的ServiceLoader3.2 TypeScript的服务注册和查找 四、结论 在构建大…...

Flutter 主流常用第三方库、插件收集

一、Flutter 学习资料 FlutterFlutter官网Flutter中文网咸鱼技术掘金Flutter专栏 Flutter - Dart中(.)、(..)、(...)语法使用_flutter ...-CSDN博客 Flutter pubspec.yaml 配置文件_flutter yaml配置git-CSDN博客 Flutter 添加 example流程_建flutter 工程 怎么自动有example-C…...

【在Linux世界中追寻伟大的One Piece】多路转接select

目录 1 -> I/O多路转接之select 1.1 -> 初识select 1.2 -> select函数原型 1.3 -> 关于fd_set结构 1.4 -> 关于timeval结构 2 -> 理解select执行过程 2.1 -> Socket就绪条件 2.2 -> select特点 2.3 -> select缺点 3 -> select使用示例…...

补一下 二维 平面直角坐标系 到三维

上一篇帖子写到 二维的平面直角坐标系&#xff0c;是那样的&#xff0c;这次补充一下三维的。首先需要&#xff0c;安装一个包&#xff0c;如下&#xff1a; 然后&#xff0c;把参数输入&#xff0c;输入这个坐标系的参数&#xff0c;如下&#xff1a; 这样就可以输出如下的三…...

如何学习Python编程?

如何学习Python编程&#xff1f; 了解基础概念&#xff1a; 学习Python的基本语法&#xff0c;包括变量、数据类型、运算符等。了解控制结构&#xff0c;如条件语句&#xff08;if语句&#xff09;和循环&#xff08;for和while循环&#xff09;。 选择学习资源&#xff1a; 在…...

使用EasyExcel实现导出excel文件时生成多级下拉选

前言 公司有个需求本来只涉及到两个下拉选项&#xff0c;后面就想能不能实现多个下拉选&#xff0c;当然我这里说的多个下拉选是联动的&#xff0c;比如省、地市、区县这种。 实现步骤 1、添加EasyExcel的Maven依赖 <dependency><groupId>com.alibaba</group…...

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色&#xff0c;分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…...

避坑指南:OpenClaw连接Qwen3-32B镜像的5大常见错误

避坑指南&#xff1a;OpenClaw连接Qwen3-32B镜像的5大常见错误 1. 为什么连接Qwen3-32B镜像容易踩坑&#xff1f; 上周我在本地尝试用OpenClaw对接Qwen3-32B镜像时&#xff0c;经历了从满怀期待到怀疑人生的全过程。本以为有了官方镜像就能一键连通&#xff0c;结果从环境配置…...

CDAN不只是论文里的公式:深入浅出图解‘条件对抗’如何让领域自适应更精准

CDAN不只是论文里的公式&#xff1a;深入浅出图解‘条件对抗’如何让领域自适应更精准 想象你是一位冰淇淋品鉴师&#xff0c;需要将一家老牌店铺&#xff08;源域&#xff09;的配方迁移到新店铺&#xff08;目标域&#xff09;。传统方法粗暴混合所有原料&#xff0c;导致巧…...

Unity资源引用:FileID+GUID的秘密

两个不起眼的数字,撑起了整个项目的引用大厦 一、开篇:一次差点毁掉项目的"手滑" 周三下午三点。 你的美术同事小王在整理项目文件夹。他觉得Assets目录太乱了——贴图、模型、材质散落在各处,像一个没人收拾的房间。 于是他开始整理: 把 Assets/player_text…...

告别广告侵扰:AdGuard广告拦截扩展全平台部署指南

告别广告侵扰&#xff1a;AdGuard广告拦截扩展全平台部署指南 【免费下载链接】AdguardBrowserExtension AdGuard browser extension 项目地址: https://gitcode.com/gh_mirrors/ad/AdguardBrowserExtension 副标题&#xff1a;从新手到高手的一站式配置方案 一、价值定…...

终极Django CORS Headers缓存优化指南:如何正确配置Vary头部提升性能

终极Django CORS Headers缓存优化指南&#xff1a;如何正确配置Vary头部提升性能 【免费下载链接】django-cors-headers Django app for handling the server headers required for Cross-Origin Resource Sharing (CORS) 项目地址: https://gitcode.com/gh_mirrors/dj/djang…...

手把手教你用MusePublic:快速生成艺术感时尚人像的保姆级教程

手把手教你用MusePublic&#xff1a;快速生成艺术感时尚人像的保姆级教程 你是不是也曾经被那些充满艺术感的时尚人像照片惊艳到&#xff0c;心里想着“要是我也能做出这样的作品就好了”&#xff1f;但一看到复杂的AI绘画工具&#xff0c;光是安装部署就让人头大&#xff0c;…...

3分钟快速上手:ComfyUI-WanVideoWrapper视频生成AI终极指南

3分钟快速上手&#xff1a;ComfyUI-WanVideoWrapper视频生成AI终极指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 还在为复杂的视频生成工具配置而头疼吗&#xff1f;ComfyUI-WanVideoWrap…...

别再死记硬背!用拖拽和右键菜单玩转汇川CodeSys网络与硬件组态

汇川CodeSys图形化组态实战&#xff1a;拖拽与右键菜单的高效玩法 第一次打开汇川CodeSys的组态界面时&#xff0c;那些密密麻麻的菜单和复杂的参数设置确实让人望而生畏。但当我发现可以用鼠标拖拽完成90%的配置工作时&#xff0c;整个PLC编程体验彻底改变了——就像从DOS命令…...

导师严选!盘点2026年最强的的降AI率网站

轻松降低论文AI率在2026年已不再是天方夜谭。以下是2026年最炸裂、实测效果显著的降AI率网站神器&#xff0c;覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景&#xff0c;帮你稳妥搞定毕业论文。 一、全流程王者&#xff1a;一站式搞定论文全链路 这类工具…...

嵌入式LED控制库:裸机/RTOS下的确定性状态管理

1. 项目概述"FonctionLED" 是一个面向嵌入式微控制器的轻量级 LED 控制函数库&#xff0c;其设计目标并非提供图形化界面或高级动画引擎&#xff0c;而是聚焦于底层硬件操作的可靠性、可预测性与最小资源占用。从项目标题&#xff08;法语“LED功能”&#xff09;和摘…...