Kotlin compose

33 阅读2分钟

声名式UI 和 命令式UI的区别

声明式UI核心特性

  • 自动数据绑定:开发者只需声明界面结构,Compose会通过by mutableStateOf自动订阅数据变化,无需手动调用findViewById更新UI。例如文本内容变更时,系统会自动触发界面刷新。
  • 函数式组件设计:所有UI元素均为大写开头的普通函数(官方称为Composable),如Text()本质是基于Canvas的全新实现,而非传统TextView。多个组件组合即可构建完整界面,代码结构与XML布局相似但功能天差地别。

与传统命令式UI的本质差异

  • 更新机制革命:传统XML+Java写法需手动编写更新逻辑(如setText()),而Compose通过Kotlin属性委托实现数据自动订阅。当控制元素显示的布尔值变化时,组件会彻底从界面树移除,而非仅隐藏可见性。
  • 语言依赖必然性:由于大量使用Kotlin特性(如协程、扩展函数),Compose几乎强制要求使用Kotlin开发。虽然官方声称支持Java,但复杂功能实现难度极大,实际上形成了对Kotlin的强依赖

Datebinding和compose的区别

Datebinding只能更新界面中的

compose可以更新界面中的任何内容,包括界面结构

UI机制的改变刚界面开发带来的灵活性和性能的提升是非常大的

compose 的测量

传统布局层级多了就是坑!因为每个ViewGroup可能对子View进行二次甚至三次测量,这可不是闹着玩的——举个栗子:两层布局+二次测量=每个子View测2次;三层布局直接翻倍到4次;四层就是8次!测量次数是指数级增长(O(2ⁿ)复杂度),层级每多一层,加载时间直接翻一倍

compose 禁止二次测量,添加Intrinsic Measurement-“固有特性测量”,compose 允许父组件在对子组件进行正式测量之前先测量这个子组件的“固有尺寸”