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

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 能自动跟踪变化并触发重组。

http://www.jsqmd.com/news/345693/

相关文章:

  • 2026年国内体脂秤权威推荐榜单及选购指南 - 一搜百应
  • Compose 中的状态可变性体系
  • 2026深圳创业办公楼出租+租赁推荐 深圳企业孵化园区租赁优选攻略 - 品牌2025
  • 2026年【离婚财产分割律师】联系电话推荐:高效联系与避坑指南 - 十大品牌推荐
  • 2026年盘点玻璃反应釜知名品牌,南通三晶性价比高口碑好推荐 - mypinpai
  • 141.环形链表
  • 2026热量减肥法APP专业评测与推荐指南 - 一搜百应
  • 2026年库尔勒靠谱的学中餐培训学校推荐,新疆新东方烹饪学校表现佳 - 工业品牌热点
  • 大模型开发必备指南:8种主流Agents框架+MCP集成全解析,建议收藏学习
  • 2026夹套玻璃反应釜生产商推荐:十大知名品牌权威盘点 - 品牌推荐大师1
  • 2026年中国离婚财产律师联系电话推荐:专业律师联系名录 - 十大品牌推荐
  • 2026年临沂采光瓦厂家最新推荐榜:玻璃钢采光瓦、聚脂纤维采光瓦、金属收边型采光瓦、透明采光瓦、PC透明采光瓦、聚焦产品品质与服务竞争力深度剖析 - 海棠依旧大
  • 邮件营销如何提高进箱率?别再只盯着“工具” - U-Mail邮件系统
  • 2026年别墅电梯大型厂家排名,意墅电梯靠谱之选,口碑超棒 - 工业推荐榜
  • 计算机毕业设计springboot长途汽车票务管理系统 基于 SpringBoot 的省际客运联网售票平台 融合 SpringBoot 的长途汽车智慧票务运营系统
  • 2026年卡西欧品牌代理推荐,细聊卡西欧代理服务怎么联系 - 工业品牌热点
  • 2026年天津口碑好的五金店排名,未来之家五金商铺靠谱吗 - 工业设备
  • 计算机毕业设计springboot壁纸网站 基于SpringBoot的高清壁纸资源分享平台的设计与实现 SpringBoot+MySQL构建的个性化桌面壁纸管理系统
  • 计算机毕业设计hadoop+spark+hive租房推荐系统 租房可视化 大数据毕业设计(源码 +LW文档+PPT+讲解)
  • 探寻稳定的螺母直销厂家,靠谱的有哪些? - mypinpai
  • 开题报告 springboot和vue毕业生信息收集系统
  • (云剪贴板)个人主页 2026/2/5
  • 好用的外磁喇叭价格大概多少钱 - 工业推荐榜
  • 计算机毕业设计springboot小区疫情期间物资配送 基于SpringBoot的封控社区生活物资保供平台 疫情封闭期间小区生活物资在线订购与配送系统
  • 开题报告 springboot和vue电子万年历
  • 基于SpringBoot的图书大厦图书管理系统毕设
  • 图拉科技全球布局加速 深化与整车厂及一级供应商的战略合作
  • 创沃斯(沈阳)科技有限公司,网络推广服务排名前十的有哪些? - 工业设备
  • 芯原增强版ISP8200-FS系列IP获ASIL B功能安全认证
  • 2026年好用的纸尿裤堆垛机品牌有哪些,肯能机械 - myqiye