news 2026/5/15 21:32:18

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/5/11 4:54:45

计算机毕业设计springboot小区疫情期间物资配送 基于SpringBoot的封控社区生活物资保供平台 疫情封闭期间小区生活物资在线订购与配送系统

计算机毕业设计springboot小区疫情期间物资配送7y509 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 2020 年初突如其来的新冠疫情让“足不出户”成为常态&#xff0c;小区大门…

作者头像 李华
网站建设 2026/5/9 12:06:20

基于SpringBoot的小区物业管理系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。 一、研究目的 本研究旨在设计并实现一个基于SpringBoot框架的小区物业管理系统&#xff0c;以满足现代小区物业管理的高效、便捷和智能化需求。具体研究目的如下&#xff…

作者头像 李华
网站建设 2026/5/9 12:07:03

大语言模型内部揭秘:从分词到文本生成的技术之旅(建议收藏)

文章解析了大语言模型从分词到文本生成的完整技术链路&#xff0c;详细介绍了Tokenization机制、人类与机器语言表示差异&#xff0c;以及神经网络应用、规模化力量等核心技术优势。同时展望了模型在知识管理、智能对话等领域的应用前景&#xff0c;并指出技术局限性与使用建议…

作者头像 李华
网站建设 2026/5/11 4:57:18

导师严选!AI论文工具 千笔 VS speedai,本科生写作神器!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。从开题到撰写&#xff0c;再到查重与修改&#xff0c;AI正在深刻改变学术写作的方式。然而&#xff0c;面对市场上琳琅满目的AI工具&#xff0c;许多本科生在选择时感到无所适…

作者头像 李华
网站建设 2026/5/10 8:10:27

盲盒小程序热门玩法分析(附开发者落地要点)

随着潮玩经济持续升温&#xff0c;盲盒小程序凭借轻量化、高裂变、低门槛的优势&#xff0c;成为开发者入局潮玩赛道的核心载体。其核心竞争力不在于界面设计&#xff0c;而在于“惊喜感可落地玩法技术适配”&#xff0c;热门玩法均围绕“未知性、社交性、收藏性”三大核心展开…

作者头像 李华