Compose 基础 - 层级上下文(覆盖常量局部生效) CompositionLocal
一、概念1.1 函数嵌套的传参问题Compose 是函数层层嵌套的形式。对于全局广泛使用的常用数据如颜色不应该层层传递下去而是在每一层都能直接获取但全局变量存在修改隐患。显式传参通过参数列表传递。外层数据想要传递给更底层使用得通过参数列表层层传递污染中间函数还会导致调用链边长嵌套深耦合高不利于复用。隐式传参读取全局变量。虽然更底层能直接获取但一处更改所有调用处都被改内部隐式依赖了外部导致难测试还存在重组多线程引起的并发问题。数据变化后想要传递给更底层使用又回到了显示传参的问题。1.2 使用效果创建 CompositionLocal 时设置的默认值无法后期修改但可以被 CompositionLocalProvider 覆盖后在局部生效修改这个用来覆盖的值只会影响该 CompositionLocalProvider 范围内。通过定义全局参数 Localxxx可以在函数嵌套结构中直接获取值而无需层层传递。使用 CompositionLocalProvider 可对该常量值进行覆盖在它提供的局部作用域内无论函数层级依旧是通过全局参数名称 Localxxx 获取值但获取的是覆盖后的值出了作用域失效再获取就是默认值。起到函数穿透和层级上下文的作用。若存在 CompositionLocalProvider 嵌套内层获取的是内层覆盖的值出了内层再获取就是外层覆盖的值出了最外层再获取就是默认值若修改这个用来覆盖的值若覆盖的是 compositionLocalOf() 常量只会引起 CompositionLocalProvider 作用域内读取该常量的组件重组。若覆盖的是 staticCompositionLocalOf() 常量则会引起 CompositionLocalProvider 作用域内全部重组。二、使用命名方式需要以“local” 开头top-level需要以“Local”开头。compositionLocalOf()叫它动态Localpublic fun T compositionLocalOf(policy: SnapshotMutationPolicyT structuralEqualityPolicy(),defaultFactory: () - T,): ProvidableCompositionLocalTstaticCompositionLocalOf()叫它静态Localpublic fun T staticCompositionLocalOf(defaultFactory: () - T): ProvidableCompositionLocalT当提供的默认值几乎不会被更改的时候使用性能更高因为上面那个会追踪值的读取。CompositionLocalProviderpublic fun CompositionLocalProvider(value: ProvidedValue*,content: Composable () - Unit)提供作用域提供的值只在该作用域内有效。providespublic infix fun provides(value: T): ProvidedValueT用来提供值可以是函数调用推荐是中缀调用。currentpublic inline val current: T取出的值为最近的外层CompositionLocalProvider所提供的值若外层没有CompositionLocalProvider则为默认值。//编译器会提示变量名应该以“Local”为前缀 val LocalUser compositionLocalOf { User(张三) } //不想提供或无法提供有意义的默认值可以直接抛异常。 //val LocalUser compositionLocalOf { error(LocalUser没有提供值) } Composable fun Demo() { var user by remember { mutableStateOf(User(李四)) } //改变这个变量会触发重组 Column { CompositionLocalProvider( LocalUser provides user //用变量值对常量进行覆盖并在局部作用域内生效 ) { val user1 LocalUser.current //外层作用域内读取的值是“李四” //嵌套一层 CompositionLocalProvider( LocalUser provides User(王五) //用非变量覆盖不需要变更控制重组的话 ) { val user2 LocalUser.current //嵌套作用域内读取的值是“王五” } val user3 LocalUser.current //出了嵌套作用域回到外层作用域读取的值是“李四” } val user4 LocalUser.current //出了外层作用域读取的值是默认的“张三” } }三、系统提供的上下文LocalContext配置LocalConfiguration密度LocalDensity震动LocalHapticFeedback

相关新闻

nacos安装起初

nacos安装起初

1.1.cd conf vi application.properties修改端口和iptongncs.server.main.port8850tongncs.inetutils.ip-address168.1.88.842.添加数据库配置spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://10.10.81.214:3306/nacos_config? characterEncodingutf8&&…

2026/10/27 2:55:01 阅读更多 →
Onekey:5个核心技术点解密Steam游戏清单自动化配置工具

Onekey:5个核心技术点解密Steam游戏清单自动化配置工具

Onekey:5个核心技术点解密Steam游戏清单自动化配置工具 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey Onekey是一款专为Steam平台设计的开源游戏解锁工具,通过自动化流程…

2026/10/25 5:32:08 阅读更多 →
遗漏充值-提醒补氪-功能设计案

遗漏充值-提醒补氪-功能设计案

注:以《叫我万岁爷手游》为例。 ——小柿子 创建日期:2023年4月8日周六 完成日期:2023年4月9日周天 咱就是说 真不是不愿充 而忘性是真的大 ! 已经数不清好多回了 反正遗漏充值确实省钱 为我省得个一分半角的 却难平抚我错…

2026/10/25 2:04:34 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →