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

Flutter InheritedWidget 详解

📌 什么是 InheritedWidget

  • InheritedWidget 是 Flutter 数据向下传递 的机制。
  • 它允许你把 数据存储在 Widget 树的某个节点,树下的子组件可以直接获取这些数据,而不需要层层参数传递。
  • Flutter 的 Provider、Bloc、Theme.of、MediaQuery.of 都是基于 InheritedWidget 实现的。

📖 继承关系

Object↳ Diagnosticable↳ DiagnosticableTree↳ Widget↳ ProxyWidget↳ InheritedWidget

🛠 使用方式

1. 定义一个 InheritedWidget

class CounterInheritedWidget extends InheritedWidget {final int counter;const CounterInheritedWidget({Key? key,required this.counter,required Widget child,}) : super(key: key, child: child);// 提供一个静态方法,方便子树获取数据static CounterInheritedWidget? of(BuildContext context) {return context.dependOnInheritedWidgetOfExactType<CounterInheritedWidget>();}// 当 counter 改变时,是否通知子 Widget 重新 buildbool updateShouldNotify(CounterInheritedWidget oldWidget) {return oldWidget.counter != counter;}
}

2. 在 Widget 树中使用

class CounterApp extends StatefulWidget {_CounterAppState createState() => _CounterAppState();
}class _CounterAppState extends State<CounterApp> {int _counter = 0;void _increment() {setState(() {_counter++;});}Widget build(BuildContext context) {return CounterInheritedWidget(counter: _counter,child: Scaffold(appBar: AppBar(title: Text("InheritedWidget Demo")),body: Center(child: CounterText()),floatingActionButton: FloatingActionButton(onPressed: _increment,child: Icon(Icons.add),),),);}
}class CounterText extends StatelessWidget {Widget build(BuildContext context) {final inherited = CounterInheritedWidget.of(context);return Text("当前计数: ${inherited?.counter}",style: TextStyle(fontSize: 24),);}
}

🔍 核心点

  1. 数据存放在 InheritedWidget

    • 比如 counter
  2. 子 Widget 获取数据时要用 dependOnInheritedWidgetOfExactType

    • 这样,当 InheritedWidget 更新时,子 Widget 会自动 build
  3. updateShouldNotify 控制是否通知

    • 如果返回 true,依赖它的子 Widget 会重建。
    • 如果返回 false,不会触发更新(提高性能)。

📌 实际应用

  • Flutter 内置

    • Theme.of(context) → 通过 InheritedWidget 获取主题
    • MediaQuery.of(context) → 获取屏幕信息
    • Localizations.of(context) → 获取国际化
  • 第三方库

    • ProviderRiverpodBloc 等,都是对 InheritedWidget 的封装

✅ 总结

  • InheritedWidget数据共享的基石,可以避免参数层层传递。
  • 适合做 全局状态(主题、语言、屏幕信息)局部状态共享(比如父传子、兄弟组件共享数据)
  • 在实际项目中,我们很少直接用它,而是通过 Provider / Riverpod / Bloc 等更高级的封装。
http://www.dtcms.com/a/344219.html

相关文章:

  • 学习嵌入式的第二十四天——数据结构——队列和树
  • Flutter 从入门到精通 - 完整课程总结
  • 打印机怎么连接电脑?打印机驱动?【图文详解】USB连接打印机?wifi连接打印机?
  • ZKmall模块商城的跨境电商支付安全方案:加密与权限的双重防护
  • STL关联式容器解析:map与set详解
  • 电脑芯片大的32位与64位指的是什么
  • 94. 城市间货物运输 I, Bellman_ford 算法
  • 解读商业智能BI,数据仓库中的元数据
  • Python训练营打卡Day40-简单CNN
  • memcmp 函数的使用及其模拟实现
  • io.github.lucksiege:pictureselector状态栏没沉浸问题
  • 十大麦克风品牌排行榜,顶级麦克风品牌排行榜,麦克风品牌排行榜
  • 同济北化工联手AM:800 ℃/20 s磁感应闪焊合金负极,金属电池枝晶终结者
  • 一洽客服系统:自定义渠道启用路由和样式设置
  • 【自用】Maven常用依赖
  • AI知识管理全面指南:助力企业高效协作与创新
  • 【STM32】CubeMX(十一):FreeRTOS任务挂起与解挂
  • 汽车行业AI视觉检测方案(四):管控发动机外观缺陷
  • 【网卡配置编辑器】快捷的编辑网卡配置,便于调试网络设备
  • DOLO 上涨:Berachain 生态爆发的前奏?
  • 怎么用pytorch训练一个模型,并跑起来
  • More Effective C++ 条款02:最好使用C++转型操作符
  • JMeter 安装教程:轻松开启性能测试之旅
  • 前后端分离项目(Web篇)
  • BlockingQueue 是什么?
  • MySQL连接原理深度解析:从算法到源码的全链路优化
  • 微信扫码登陆 —— 接收消息
  • 关于日本服务器的三种线路讲解
  • 【Day01】堆与字符串处理算法详解
  • SHA 系列算法教程