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

Jetpack Compose CompositionLocal 深入解析:局部参数透传实践

Jetpack Compose CompositionLocal 深入解析:局部参数透传实践

在 Jetpack Compose 中,如何优雅地在组件之间传递数据,而不需要层层传参? CompositionLocal 就是为了解决这个问题的!

1. 什么是 CompositionLocal?

1.1 背景问题

在传统的 Android View 开发中,我们通常使用 ContextSharedPreferences 来在不同组件间共享数据。而在 Compose 中,我们希望数据能在 Composable 组件树 内高效传递,而不必依赖 ViewModelremember 变量。

例如,以下代码演示了 传统的参数层层传递,这样会导致代码可读性降低:

@Composable
fun Parent() {val theme = "Dark"  // 需要传递的主题数据Child(theme)
}@Composable
fun Child(theme: String) {GrandChild(theme)
}@Composable
fun GrandChild(theme: String) {Text("当前主题: $theme")
}

每个子组件都要手动传递 theme,这在深层嵌套时会变得非常麻烦。

1.2 CompositionLocal 的作用

CompositionLocal 允许你在 组件树的某个范围内提供数据,子组件可以直接访问,而不需要逐层传递参数。这类似于 “局部全局变量”,即 在局部范围内可共享的全局状态

2. CompositionLocal 的使用方式

2.1 定义 CompositionLocal

我们可以使用 compositionLocalOfstaticCompositionLocalOf 来创建局部状态:

val LocalTheme = compositionLocalOf { "Light" }  // 默认值为 "Light"

2.2 提供数据

使用 CompositionLocalProvider 提供自定义值,在某个作用域内修改 LocalTheme

@Composable
fun Parent() {CompositionLocalProvider(LocalTheme provides "Dark") {  // 提供 "Dark" 主题Child()}
}

2.3 在子组件中获取数据

子组件可以直接使用 LocalTheme.current 获取当前值,而不需要显式传参:

@Composable
fun GrandChild() {val theme = LocalTheme.current  // 获取当前主题Text("当前主题: $theme")
}

完整代码如下:

val LocalTheme = compositionLocalOf { "Light" }  // 定义局部变量@Composable
fun Parent() {CompositionLocalProvider(LocalTheme provides "Dark") {Child()}
}@Composable
fun Child() {GrandChild()
}@Composable
fun GrandChild() {val theme = LocalTheme.currentText("当前主题: $theme")
}

3. CompositionLocal 的应用场景

3.1 主题切换

MaterialTheme 也是基于 CompositionLocal 实现的,可以全局切换深色或浅色模式。

val LocalDarkMode = compositionLocalOf { false }

3.2 多语言(国际化)

可以使用 CompositionLocal 传递当前的语言环境,避免层层传递 Locale

val LocalLocale = compositionLocalOf { Locale.getDefault() }

3.3 用户权限管理

在某些情况下,我们可能需要传递用户权限或角色,以决定 UI 的显示逻辑。

val LocalUserRole = compositionLocalOf { "Guest" }

3.4 配置信息

可以传递一些全局的配置信息,如 API Base URL、是否开启调试模式等。

val LocalConfig = staticCompositionLocalOf { Config(debugMode = false) }

4. CompositionLocal 的使用注意事项

虽然 CompositionLocal 方便,但并不适合所有情况,以下几点需要注意:

4.1 不要滥用,避免全局状态污染

CompositionLocal 适用于 局部但全局 的数据,比如主题、语言,而不是 业务逻辑数据

如果数据会频繁变化,建议使用 StateViewModel,否则可能导致数据同步问题。

4.2 staticCompositionLocalOf vs compositionLocalOf

  • compositionLocalOf推荐)适用于可变数据,如主题、语言等。
  • staticCompositionLocalOf 适用于不可变数据,如配置项,性能更优。

5. 总结

  • CompositionLocal = 局部全局变量
  • 避免参数层层传递,提高代码简洁性
  • 适用于少量静态数据,如主题、语言、环境变量
  • 使用 CompositionLocalProvider 提供值,子组件 LocalXXX.current 访问
  • 避免滥用,业务逻辑数据推荐使用 ViewModel

相关文章:

Jetpack Compose CompositionLocal 深入解析:局部参数透传实践

Jetpack Compose CompositionLocal 深入解析:局部参数透传实践 在 Jetpack Compose 中,如何优雅地在组件之间传递数据,而不需要层层传参? CompositionLocal 就是为了解决这个问题的! 1. 什么是 CompositionLocal&#…...

第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:3.数字诗意

题目1 数字诗意 在诗人的眼中,数字是生活的韵律,也是诗意的表达。 小蓝,当代顶级诗人与数学家,被赋予了”数学诗人”的美誉。他擅长将冰冷的数字与抽象的诗意相融合,并用优雅的文字将数学之美展现于纸上。 某日&…...

Oracle数据库数据编程SQL<8 文本编辑器Notepad++和UltraEdit(UE)对比>

首先,用户界面方面。Notepad是开源的,界面看起来比较简洁,可能更适合喜欢轻量级工具的用户。而UltraEdit作为商业软件,界面可能更现代化,功能布局更复杂一些。不过,UltraEdit支持更多的主题和自定义选项&am…...

P12013 [Ynoi April Fool‘s Round 2025] 牢夸 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),有 m m m 个操作分两种: add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...

PostgreSQL LIKE 操作符详解

PostgreSQL LIKE 操作符详解 引言 在数据库查询中,LIKE 操作符是一种非常常用的字符串匹配工具。它可以帮助我们实现模糊查询,从而提高查询的灵活性。本文将详细介绍 PostgreSQL 中的 LIKE 操作符,包括其语法、使用方法以及一些注意事项。 LIKE 操作符语法 LIKE 操作符通…...

【前端】【Nuxt3】Nuxt3的生命周期

路由导航和中间件执行顺序 路由导航开始 中间件执行顺序: 全局中间件(middleware/*.global.js)布局中间件(在definePageMeta中定义的布局级中间件)页面中间件(在definePageMeta中定义的页面级中间件&#…...

热更新简介+xLua基础调用

什么是冷更新 开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能测试。测试成功后,用户即可在AppStore看到应用的更新信息,用户点击应用更新后,需要先关闭应用,再进行更新。 什么是…...

大钲资本押注儒拉玛特全球业务,累计交付超2500条自动化生产线儒拉玛特有望重整雄风,我以为它破产倒闭了,担心很多非标兄弟们失业

1. 交易概况 时间与主体:大钲资本于2025年4月1日正式宣布完成对儒拉玛特自动化技术(苏州)有限公司及其全球子公司和关联企业的收购。交易通过大钲资本旗下美元基金设立的儒拉玛特(新加坡)公司作为控股主体进行,交易金额未披露。 收购范围:包括儒拉玛特亚太、欧洲、北美等…...

FPGA系统开发板调试过程不同芯片的移植步骤介绍

目录 1.我目前使用的开发板 2.不同开发板的移植 步骤一:芯片型号设置 步骤二:约束修改 步骤三、IP核更新 关于FPGA系统开发板调试过程中不同芯片的移植。我需要先理清楚FPGA开发中移植到不同芯片的一般流程。首先,移植通常涉及到更换FPG…...

算法设计与分析5(动态规划)

动态规划的基本思想 将一个问题划分为多个不独立的子问题,这些子问题在求解过程中可能会有些数据进行了重复计算。我们可以把计算过的数据保存起来,当下次遇到同样的数据计算时,就可以查表直接得到答案,而不是再次计算 动态规划…...

ModuleNotFoundError: No module named ‘matplotlib_inline‘

ModuleNotFoundError: No module named matplotlib_inline 1. ModuleNotFoundError: No module named matplotlib_inline2. matplotlib-inlineReferences 如果你在普通的 Python 脚本或命令行中运行代码,那么不需要 matplotlib_inline,因为普通的 Python…...

Mysql 中的 B+树 和 B 树在进行数据增删改查后的结构调整过程是怎样的?

B 树的增、删、改、查数据的调整过程 在 MySQL 中,B 树 是一种广泛用于存储引擎(如 InnoDB)中的索引结构。B 树的结构使得它非常适合于处理大量数据的插入、删除和查询等操作。B 树是一种自平衡的树数据结构,其中所有的值都存储在…...

在Rust生态中探索高性能HTTP服务器:Hyperlane初体验

在Rust生态中探索高性能HTTP服务器:Hyperlane初体验 最近在调研Rust的HTTP服务器方案时,发现了一个有趣的新项目——Hyperlane。这个轻量级库宣称在保持简洁API的同时,性能表现可圈可点。作为Rust生态的长期观察者,我决定深入体验…...

AI医疗诊疗系统设计方案

AI医疗诊疗系统设计方案 1. 项目概述 1.1 项目背景 随着人工智能技术的快速发展,将AI技术应用于医疗诊疗领域已成为提升医疗服务效率和质量的重要途径。本系统旨在通过AI技术辅助医生进行诊疗服务,提供智能化的医疗决策支持。 1.2 项目目标 提供全面…...

k8s的StorageClass存储类和pv、pvc、provisioner、物理存储的链路

k8s的StorageClass存储类和pv、pvc、provisioner、物理存储的链路 StorageClass能自动创建pv 在控制器中,直接声明storageClassName,不仅能自动创建pvc,也能自动创建pv stoageclass来自于provisioner,provisioner来自于pod&#x…...

【移动编程技术】作业1 中国现代信息科技发展史、Android 系统概述与程序结构 作业解析

单选题(共 20 题,每题 5 分,满分 100 分) (单选题) 1946 年第一台计算机问世,计算机的发展经历了 4 个时代,它们是()。 选项: A. 模拟计算机、数字计算机、混合计算机、智…...

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术&#xff0c…...

使用ollama部署本地大模型(没有GPU也可以),实现IDEA和VS Code的git commit自动生成

详情 问豆包,提示词如下:收集下ollama相关信息,包括但不限于:官网地址/GitHub地址/文档地址 官网地址 https://ollama.com/ GitHub 地址 https://github.com/ollama/ollama 文档地址 https://github.com/ollama/ollama/blo…...

线程同步与互斥(上)

上一篇:线程概念与控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们学习了线程的控制及其相关概念之后&#…...

ngx_test_full_name

定义在 src\core\ngx_file.c static ngx_int_t ngx_test_full_name(ngx_str_t *name) { #if (NGX_WIN32)u_char c0, c1;c0 name->data[0];if (name->len < 2) {if (c0 /) {return 2;}return NGX_DECLINED;}c1 name->data[1];if (c1 :) {c0 | 0x20;if ((c0 &…...

R 列表:深入解析及其在数据分析中的应用

R 列表&#xff1a;深入解析及其在数据分析中的应用 引言 在R语言中&#xff0c;列表&#xff08;List&#xff09;是一种非常重要的数据结构&#xff0c;它允许将不同类型的数据项组合在一起。列表在数据分析、统计建模以及数据可视化中扮演着关键角色。本文将深入探讨R列表…...

智能体中的知识库、数据库与大模型详解

前言 在 LLM&#xff08;大语言模型&#xff09;驱动的智能体架构中&#xff0c;知识库&#xff08;Knowledge Base&#xff09;、数据库&#xff08;Database&#xff09;和大模型&#xff08;LLM&#xff09;是关键组成部分&#xff0c;它们共同决定了智能体的理解能力、决策…...

AMD Versal™ AI Core Series VCK190 Evaluation Kit

AMD Versal™ AI Core Series VCK190 Evaluation Kit AMD VCK190 是首款 Versal™ AI Core 系列评估套件&#xff0c;可帮助设计人员使用 AI 和 DSP 引擎开发解决方案&#xff0c;与当前的服务器级 CPU 相比&#xff0c;该引擎能够提供超过 100 倍的计算性能。Versal AI Core …...

ARM-外部中断,ADC模数转换器

根据您提供的图片&#xff0c;我们可以看到一个S3C2440微控制器的中断处理流程图。这个流程图展示了从中断请求源到CPU的整个中断处理过程。以下是流程图中各个部分与您提供的寄存器之间的关系&#xff1a; 请求源&#xff08;带sub寄存器&#xff09;&#xff1a; 这些是具体的…...

【从零实现Json-Rpc框架】- 项目实现 - 客户端注册主题整合 及 rpc流程示意

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

AWS 云运维管理指南

一、总体目标 高可用性:通过跨可用区 (AZ) 和跨区域 (Region) 的架构设计,确保系统运行可靠。性能优化:优化AWS资源使用,提升应用性能。安全合规:利用AWS内置安全服务,满足行业合规要求(如GDPR、ISO 27001、等保2.0)。成本管控:通过成本优化工具,减少浪费,实现FinOp…...

vector的实现:

我们之前讲了vector的接口&#xff0c;我们今天来看一下vector的底层的实现&#xff1a; 在gitee上面我们的这个已经实现好了&#xff0c;我们看gitee就可以&#xff1a;vector的实现/vector的实现/vector的实现.h 拾亿天歌/拾亿天歌 - 码云 - 开源中国 我们在这强调比较难的…...

flutter 专题 九十六 Flutter开发之常用Widgets

上一篇&#xff0c;我们介绍了基础Widgets&#xff0c;接下来&#xff0c;我们看一下Flutter开发中一些比较常见的Widget。 Flutter Widget采用现代响应式框架构建&#xff0c;这是从 React 中获得的灵感&#xff0c;中心思想是用widget构建你的UI。 Widget描述了他们的视图在…...

Linux环境下内存错误问题排查与修复

最近这几天服务器总是掉线&#xff0c;要查一下服务器的问题。可以首先查看一下计算机硬件&#xff0c;这是一台某鱼上拼凑的服务器&#xff1a; sudo lshw -shortH/W path Device Class Description system NF5270M3 (To be filled by O…...

flutter 专题 六十八 Flutter 多图片上传

使用Flutter进行应用开发时&#xff0c;经常会遇到选图、拍照等需求。如果要求不高&#xff0c;Flutter图库选择可以使用官方提供的image_picker&#xff0c;如果需要多选&#xff0c;那么可以使用multi_image_picker插件库。multi_image_picker库支持图库管理&#xff0c;多选…...

与总社团联合会合作啦

2025.4.2日&#xff0c;我社团向总社团联合会与暮光社团发起合作研究“浔川代码编辑器v2.0”。至3日&#xff0c;我社团收到回复&#xff1a; 总社团联合会&#xff1a; 总社团联合会已收到浔川社团官方联合会的申请&#xff0c;经考虑&#xff0c;我们同意与浔川社团官方联合…...

技巧:使用 ssh 设置隧道代理访问 github

问题 由于不可知的原因&#xff0c;在国内服务器不能访问 Github。但是有clone代码需求&#xff0c;这里介绍一种可行的方法。 解决办法 使用 ssh 设置代理&#xff0c;让代理服务器请求 github 解决。 第一步 ssh -fND 1080 用户名代理服务器IP这里的意思是监听 1080 端口…...

安装 TabbyAPI+Exllamav2 和 vLLM 的详细步骤

在 5090 显卡上成功安装 TabbyAPIExllamav2 和 vLLM 并非易事&#xff0c;经过一番摸索&#xff0c;我总结了以下详细步骤&#xff0c;希望能帮助大家少走弯路。 重要提示&#xff1a; 用户提供的 PyTorch 安装使用了 cu128&#xff0c;这并非标准 CUDA 版本。请根据你的系统实…...

Linux 进程信号

目录 信号 生活角度的信号 技术应用角度的信号 signal函数 信号概念 用kill -l命令可以察看系统定义的信号列表 信号处理常见方式概览 信号的产生 通过键盘组合键发送信号 通过系统函数向进程发信号 由软件条件产生信号 由硬件异常产生信号 信号的保存 阻塞信号 ​…...

【学习篇】fastapi接口定义学习

fastapi学习链接&#xff1a;用户指南 1. 路径参数 访问fastapi接口的默认http路径为http://127.0.0.1:8000&#xff0c;/items为定义的接口函数read_item的路径&#xff0c;/{item_id}这个用大括号括起来的参数就是路径参数&#xff0c;接口函数可以通过引用这个路径参数名称…...

第十二步:react

React 1、安装 1、脚手架 npm i -g create-react-app&#xff1a;安装react官方脚手架create-react-app 项目名称&#xff1a;初始化项目 2、包简介 react&#xff1a;react框架的核心react-dom&#xff1a;react视图渲染核心react-native&#xff1a;构建和渲染App的核心…...

MySQL简介

MySQL 是由瑞典 MySQL AB 公司开发的一款开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;现归属 Oracle 公司。以下是其核心特点及简介&#xff1a; 1. 基础特性 - 开源免费&#xff1a;遵循 GPL 协议&#xff0c;个人及中小型企业可免费使用&#xff0c;…...

AIGC时代Kubernetes企业级云原生运维实战:智能重构与深度实践指南

文章目录 一、AIGC技术栈与Kubernetes的深度融合1. 智能配置生成&#xff1a;从YAML到自然语言2. 动态资源优化&#xff1a;AI驱动的弹性伸缩 二、智能运维体系架构深度解析四维能力矩阵增强实现&#xff1a;关键组件升级代码示例&#xff1a; 三、企业级实战策略深度实践策略1…...

市场波动与交易策略优化

市场波动与交易策略优化 在交易市场中&#xff0c;价格波动是常态。如何有效应对市场的波动&#xff0c;制定合理的交易策略&#xff0c;成为许多交易者关注的重点。本文将探讨市场波动的影响因素&#xff0c;并介绍应对不同市场波动环境的策略。 一、市场波动的影响因素 市场供…...

Prolog语言的移动UI设计

Prolog语言的移动UI设计 随着移动设备的普及&#xff0c;用户界面的设计已成为软件开发的重要组成部分。移动UI设计不仅要注重美观&#xff0c;更要关注用户体验和功能的实现。使用Prolog语言进行移动UI设计&#xff0c;虽然相对少见&#xff0c;但其逻辑编程的特性为复杂的交…...

linux 命令 awk

awk 是 Linux/Unix 系统中一个强大的文本处理工具&#xff0c;尤其擅长处理结构化文本数据&#xff08;如日志、表格数据&#xff09;。它不仅是命令行工具&#xff0c;还是一种脚本语言&#xff0c;支持变量、条件、循环等编程特性 1. 基本语法 awk [选项] 模式 {动作} 文件名…...

在 PyQt 加载 UI 三种方法

目录 方法一&#xff1a;使用 uic 模块动态加载 &#xff08;不推荐用于大型项目&#xff09; 方法二&#xff1a;将 UI 文件编译为 Python 模块后导入 方法3&#xff1a;使用uic模块直接在代码中加载UI文件 注意事项 总结&#xff1a; 在PyQt中&#xff0c;加载UI文件通常…...

前端快速入门学习2-HTML

一、概述 HTML全称是Hypertext Markup Language(超文本标记语言) HTML通过一系列的 标签(也称为元素) 来定义文本、图像、链接等等。HTML标签是由尖括号包围的关键字。 标签通常成对出现&#xff0c;包括开始标签和结束标签(也称为双标签)&#xff0c;内容位于这两个标签之间…...

Cortex-M系列MCU的位带操作

Cortex-M系列位带操作详解 位带&#xff08;Bit-Banding&#xff09;是Cortex-M3/M4等处理器提供的一种硬件特性&#xff0c;允许通过别名地址对内存或外设寄存器中的单个位进行原子读-改-写操作&#xff0c;无需禁用中断或使用互斥锁。以下是位带操作的完整指南&#xff1a; …...

【嵌入式-stm32电位器控制LED亮灭以及编码器控制LED亮灭】

嵌入式-stm32电位器控制LED亮暗 任务代码Key.cKey.hmain.c 实验现象 任务 本文主要介绍利用stm32f103C8T6实现电位器控制PWM的占空比大小来改变LED亮暗程度&#xff0c;按键实现使用定时器非阻塞式&#xff0c;其中一个按键切换3个LED的控制状态&#xff0c;另一个按键是重置当…...

抖音热点视频识别与分片处理机制解析

抖音作为日活数亿的短视频平台,其热点视频识别和分片处理机制是支撑高并发访问的核心技术。以下是抖音热点视频识别与分片的实现方案: 热点视频识别机制 1. 实时行为监控系统 用户行为聚合:监控点赞、评论、分享、完播率等指标的异常增长曲线内容特征分析:通过AI识别视频…...

添加购物车功能

业务需求&#xff1a; 用户提交三个字段&#xff0c;服务端根据提交的字段判断是菜品还是套餐&#xff0c;根据菜品或者套餐添加购物车表中。 代码实现 RestController Slf4j RequestMapping("/user/shoppingCart") public class ShoppingCartController {Autowired…...

蓝桥杯备赛 Day16 单调数据结构

单调栈和单调队列能够动态的维护&#xff0c;还需用1-2两个数组在循环时从单调栈和单调队列中记录答案 单调栈 要点 1.时刻保持内部元素具有单调性质的栈(先进后出),核心是:入栈时逐个删除所有"更差的点",一般可分为单调递减栈、单调递增栈、单调不减栈、单调不增…...

AI Agent开发大全第十九课-神经网络入门 (Tensorflow)

(前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 一、从买房困惑到神经元:神经网络的灵感来源 1.1 房地产经纪人的定价难题 想象一个周末的房产中介门店,经纪人小李正面对10份不同房源的报...

Mac VM 卸载 win10 安装win7系统

卸载 找到相应直接删除&#xff08;移动到废纸篓&#xff09; 可参考&#xff1a;mac如何卸载虚拟机win 下载 win7下载地址...