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

理解 create 指向的箭头函数

场景

void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return ChangeNotifierProvider(create: (context) => MyAppState(),child: MaterialApp(title: 'Namer App',theme: ThemeData(useMaterial3: true,colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),),home: MyHomePage(),),);}
}

Analysis

ChangeNotifierProvider 里,create: 参数接收一个函数,用来“现场”构造要提供给子树的对象。写成

create: (context) => MyAppState(),

可以逐句拆解成下面几点:

片段含义iOS 类比
(context) => ...匿名函数(或称“箭头函数”);框架在插入 Provider 时调用一次。context 是当前 Provider 所在节点的 BuildContext,很少用到,但可用于读取别的 Provider 或 Theme。类似在 loadView() 里用闭包初始化子视图
MyAppState()函数返回的新实例。因为 MyAppState 继承自 ChangeNotifier,它具备 addListener / notifyListeners 等能力,能在数据变动时通知 UI 重建。自己写的 Observable / NSNotification 发布者
返回值这就是 Provider 要“注入”进 widget tree 的状态对象。子树里可以 context.watch<MyAppState>() 拿到同一个实例。单例 / 依赖注入容器里保存的共享实例

生命周期 & 线程

  1. 只创建一次

    • ChangeNotifierProvider 首次出现在 widget tree 时,框架调用 create
    • 后续因父组件 setState 导致的重建不会再执行 create——实例被缓存并复用。
  2. 自动释放

    • 当 Provider 被移出 widget tree(比如页面 pop),它会自动调用 dispose(),而 ChangeNotifierProvider 已经帮你把 MyAppState.dispose() 调好。
    • 你无需手动管理内存/订阅取消,和 SwiftUI 的 @StateObject 有点像。
  3. 主线程保证

    • Flutter 所有 UI 更新与通知回调默认都在主 isolate(≈ 主线程)执行,不用担心线程切换。

为什么不用 value:

ChangeNotifierProvider(value: someExistingInstance,child: ...
)
  • value: 只适合已经存在的对象(比如从外部传进来的单例)。
  • 如果自己 new 一个对象再塞给 value:,Provider 就不知道何时该自动 dispose(),容易造成内存泄漏。
  • 因此自己创建对象时,应优先用 create:

总结

  • create: 负责 实例化托管 状态对象;
  • Provider 把该对象挂在 widget tree 上,供后代通过 context.watch / read / select 访问;
  • 当 Provider 被移除时,自动 dispose(),让资源安全回收。

把这点想成“Provider = 带生命周期管理的依赖注入容器”,就不难理解了。

http://www.xdnf.cn/news/1058779.html

相关文章:

  • 从零Gazebo中实现Cartographer算法建图
  • DBeaver 中 Greenplum、PostgreSQL 和 PostgreSQL (old) 驱动的区别
  • 前端跨域解决方案(4):postMessage
  • 剑指offer32_二叉搜索树的后序遍历序列
  • 新发布的一款使用ReactNative新架构加载Svga动画的开源插件[android/ios]
  • 数据结构——选择题—查漏补缺
  • 【unitrix】 3.0 基本结构体(types.rs)
  • 二、OpenCV的第一个程序
  • Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量
  • 结合 STM32CubeMX 使用 FreeRTOS 实时操作系统
  • 【ClipPal】推荐一个非常好用的粘贴板记录工具
  • 侧信道分析中的简单模板攻击(TA)Python实现(带测试)
  • 【web应用】Vue 3 中实现 Chart.js 折线图:详细指南与最佳实践
  • 14.2 《3小时从零搭建企业级LLaMA3语言助手:GitHub配置+私有化模型集成全实战》
  • 基于CNN的FashionMNIST数据集识别6——DenseNet模型
  • 基于深度学习的智能文本摘要系统:技术与实践
  • Uniapp性能优化全面指南:从原理到实践
  • GNU Octave 基础教程(1):在 Ubuntu 22.04 和 Windows 11 上的安装指南
  • 【Linux】UDP与TCP协议
  • 电路图识图基础知识-普通卧式镗床识图(三十)
  • 深度体验KingbaseES在线平台:从零掌握企业级数据库实战(附架构图+代码案例)
  • Python基础学习框架(总周期:8周)
  • 九日集训第六天
  • 1572. 矩阵对角线元素的和
  • 计算机网络学习笔记:TCP流控、拥塞控制
  • 大模型知识库RAG框架,比如LangChain、ChatChat、FastGPT等等,哪个效果比较好
  • 前端开发面试题总结-vue2框架篇(三)
  • 安装谷歌vue开发工具插件devtools支持vue2
  • CentOS7 安装最新版 Docker
  • 【RocketMQ 生产者和消费者】- 消费者重平衡(1)