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/7/24 22:58:08 阅读更多 →
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/7/24 22:58:08 阅读更多 →
遗漏充值-提醒补氪-功能设计案

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

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

2026/7/24 22:58:08 阅读更多 →

最新新闻

大模型时代NLP技术演进与实战指南

大模型时代NLP技术演进与实战指南

1. 大模型时代下的NLP技术演进赵宇教授的新书《自然语言处理:大模型理论与实践》来得正是时候。作为一名长期关注NLP领域发展的从业者,我亲眼见证了从传统规则系统到统计方法,再到如今大模型主导的技术变迁。这本书的出版,恰好为想…

2026/7/24 23:04:10 阅读更多 →
为了让你顺利分析生信数据,我们默默的做了这些事情

为了让你顺利分析生信数据,我们默默的做了这些事情

一、搬家搬家 就在这个月初,我们停机迁移了西南一区的机房,并给大家双倍延长了停机的这段时长。至于为什么要做迁移,自然是给大家的数据分析保驾护航。西柚云超算与云南联通正式达成战略合作 :共同建设云南科研超算中心节点。 访…

2026/7/24 23:04:10 阅读更多 →
3分钟掌握SQLyog:完全免费的MySQL数据库管理工具终极指南

3分钟掌握SQLyog:完全免费的MySQL数据库管理工具终极指南

3分钟掌握SQLyog:完全免费的MySQL数据库管理工具终极指南 【免费下载链接】sqlyog-community Webyog provides monitoring and management tools for open source relational databases. We develop easy-to-use MySQL client tools for performance tuning and dat…

2026/7/24 23:04:10 阅读更多 →
AI少儿背单词APP开发:神经科学与强化学习的融合实践

AI少儿背单词APP开发:神经科学与强化学习的融合实践

1. AI少儿背单词APP开发全景解析作为深耕教育科技领域八年的开发者,我完整参与了三个代际的单词记忆类产品迭代。当前AI技术的突破性进展,让我们能够打造出真正符合儿童认知规律的智能学习工具。这款APP的核心突破点在于将神经科学理论与强化学习算法深度…

2026/7/24 23:04:10 阅读更多 →
PTA基础编程题目集 7-1厘米换算英尺英寸(C语言实现)

PTA基础编程题目集 7-1厘米换算英尺英寸(C语言实现)

摘要:本文是 PTA 编程题“7-1 厘米换算英尺英寸”的题解,涵盖题目描述、输入输出格式及 C 语言实现,展示厘米转英制英尺英寸的换算方法。 题目描述 如果已知英制长度的英尺 foot 和英寸 inch的值,那么对应的米是(foot inch/12) …

2026/7/24 23:04:10 阅读更多 →
如何在5分钟内为MusicBee配置网易云音乐歌词插件:终极歌词同步解决方案

如何在5分钟内为MusicBee配置网易云音乐歌词插件:终极歌词同步解决方案

如何在5分钟内为MusicBee配置网易云音乐歌词插件:终极歌词同步解决方案 【免费下载链接】MusicBee-NeteaseLyrics A plugin to retrieve lyrics from Netease Cloud Music for MusicBee. 项目地址: https://gitcode.com/gh_mirrors/mu/MusicBee-NeteaseLyrics …

2026/7/24 23:03:10 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻