news 2026/5/1 8:30:46

kotlin和compose中使用by

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
kotlin和compose中使用by

by是 Kotlin 中的一个关键字,表示委托(delegation)。它的含义是:“将这个属性的 getter 和 setter 委托给另一个对象处理”。

1.基本概念

// 没有 by:直接赋值vala="Hello"// a 存储字符串本身// 有 by:委托valbbydelegateObject// b 的读写操作委托给 delegateObject 处理

2.by在 Compose 中的具体含义

在 Compose 中,by通常与mutableStateOf一起使用:

// 没有 by:myText 是一个 MutableState<String> 对象valmyText=remember{mutableStateOf("Hello")}// 使用:myText.value = "World" 需要 .value// 有 by:myText 看起来是一个普通的 String,但实际上委托给了 MutableStatevarmyTextbyremember{mutableStateOf("Hello")}// 使用:myText = "World" 不需要 .value,看起来像普通变量

3.底层原理:属性委托

Kotlin 的委托机制:

// 自定义委托类classSimpleDelegate<T>(privatevarvalue:T){// getValue 方法:当读取属性时调用operatorfungetValue(thisRef:Any?,property:KProperty<*>):T{println("读取属性:${property.name}")returnvalue}// setValue 方法:当设置属性时调用(仅 var)operatorfunsetValue(thisRef:Any?,property:KProperty<*>,newValue:T){println("设置属性:${property.name}=$newValue")value=newValue}}// 使用委托varmessagebySimpleDelegate("Hello")// 实际执行:message = SimpleDelegate("Hello")println(message)// 调用 getValue(),输出: Hellomessage="World"// 调用 setValue("World")

4.Compose 中mutableStateOf的委托实现

mutableStateOf返回的对象实现了State接口,它提供了getValuesetValue操作符:

// 简化的 State 接口interfaceState<T>{varvalue:ToperatorfungetValue(thisRef:Any?,property:KProperty<*>):ToperatorfunsetValue(thisRef:Any?,property:KProperty<*>,value:T)}// 实际使用varcountbymutableStateOf(0)// 相当于:// val countState = mutableStateOf(0)// var count: Int// get() = countState.getValue(this, ::count)// set(value) = countState.setValue(this, ::count, value)

5.为什么需要by

没有by的缺点:

// 方式1:不使用委托valcountState=remember{mutableStateOf(0)}// 使用繁琐:countState.value++// 需要 .valueif(countState.value>5)// 需要 .valuecountState.value=10// 需要 .value

by的优点:

// 方式2:使用委托varcountbyremember{mutableStateOf(0)}// 使用简洁:count++// 看起来像普通变量if(count>5)// 看起来像普通变量count=10// 看起来像普通变量

6.by的其他使用场景

除了 Compose,by还有多种用途:

// 1. 惰性初始化(lazy)valheavyObjectbylazy{println("首次访问时初始化")HeavyObject()}// 2. 观察者模式(observable)varnamebyDelegates.observable(""){prop,old,new->println("$old->$new")}// 3. 映射委托(map)classUser(valmap:Map<String,Any?>){valname:Stringbymapvalage:Intbymap}valuser=User(mapOf("name"to"Alice","age"to25))println(user.name)// "Alice"

7.在 Compose 中的完整示例

@ComposablefunCounter(){// 1. 使用 by(推荐)varcount1byremember{mutableStateOf(0)}// 2. 不使用 byvalcount2=remember{mutableStateOf(0)}Column{// 使用 count1(简洁)Button(onClick={count1++}){Text("Count1:$count1")}// 使用 count2(繁琐)Button(onClick={count2.value++}){Text("Count2:${count2.value}")}// 3. 只读状态也可以使用 byvaldoubledbyremember{derivedStateOf{count1*2}}Text("Doubled:$doubled")}}

8.重要区别总结

特性by没有by
类型看起来是基础类型(Int, String)MutableState<T>类型
读取val current = countval current = count.value
写入count = 10count.value = 10
用途UI 状态变量需要传递状态对象本身
可读性更高,像普通变量较低,显式表明是状态

9.记忆技巧

可以把by理解为:

  • “通过…来管理”:这个属性通过后面的委托对象来管理
  • “由…代理”:这个属性的读写操作由委托对象代理
  • 语法糖:让代码更简洁的语法糖

简单规则

  • 如果属性需要在 UI 中直接使用(读取/写入),用by
  • 如果属性对象本身需要作为参数传递,不用by

10.实际应用建议

// ✅ 推荐:UI 状态使用 byvartextbyremember{mutableStateOf("")}varisSelectedbyremember{mutableStateOf(false)}varcounterbyremember{mutableIntStateOf(0)}// ✅ 推荐:需要传递的对象不用 byvalscrollState=rememberScrollState()valpagerState=rememberPagerState()vallazyListState=rememberLazyListState()// 使用:LazyColumn(state=lazyListState){...}// 需要传递状态对象本身HorizontalPager(state=pagerState){...}

一句话总结by让状态变量看起来和用起来像普通变量,但背后是委托给MutableState管理,这样 Compose 能自动跟踪变化并触发重组。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 20:46:50

图拉科技全球布局加速 深化与整车厂及一级供应商的战略合作

发布 2026 年业务展望、多个项目计划 2027 年正式量产 动力系统效率领域领军企业、动态电机驱动&#xff08;Dynamic Motor Drive&#xff0c;简称 DMD&#xff09;技术开发商图拉科技公司今日发布最新业务进展。随着公司加速推进全球商业化进程&#xff0c;其技术在中国及欧洲…

作者头像 李华
网站建设 2026/5/1 4:19:08

Office 之 办公

Word 文档 显示导航条目

作者头像 李华
网站建设 2026/5/1 7:12:58

基于STC89C52单片机的智能窗帘控制系统设计

基于STC89C52单片机的智能窗帘控制系统设计 第一章 绪论 传统窗帘依赖人工手动开合&#xff0c;操作繁琐且无法根据环境变化自动调节&#xff0c;难以满足现代家居对便捷性、舒适性的需求。STC89C52单片机作为低成本、易上手的8位微控制器&#xff0c;适配普通家庭智能化改造的…

作者头像 李华
网站建设 2026/4/30 11:06:59

基于STM32单片机的智能家居设计

基于STM32单片机的智能家居设计 第一章 绪论 传统家居设备控制依赖人工操作&#xff0c;存在交互繁琐、能源浪费、缺乏环境自适应能力等问题&#xff0c;难以满足现代家庭对便捷、节能、智能的居住需求。STM32单片机凭借高性能、低功耗、丰富外设接口的优势&#xff0c;成为智能…

作者头像 李华