⚠️ 警告:这一节非常硬核,我花了三天学习,所以不建议尝试短时间看完并理解。本节源码参照 Compose 1.3.0-alpha02回顾虽然还没有系统地学习过,对 Modifier 我们也不陌生,它用来给组件设置各种属性与监听。对于 Modifier 和直接传参也做过简要的总结:前者多用于通用属性,后者多用于特有属性。多个 Modifer 有先后关系,典型例子是 Modifier.paddi...
⚠️ 警告:这一节非常硬核,我花了三天学习,所以不建议尝试短时间看完并理解。本节源码参照 Compose 1.3.0-alpha02回顾虽然还没有系统地学习过,对 Modifier 我们也不陌生,它用来给组件设置各种属性与监听。对于 Modifier 和直接传参也做过简要的总结:前者多用于通用属性,后者多用于特有属性。多个 Modifer 有先后关系,典型例子是 Modifier.paddi...
从某种角度来说,Compose 组件是无状态的。这很好理解 —— Compose 的那些组件函数甚至都不会返回一个对象,哪有状态可言?对于传统 View,比如 TextView,可以通过 TextView.getText() 来获取其内部状态,当然,还有很多其他属性。那么 Compose 中又如何实现?答案就是 状态提升 (State Hoisting)。听起来很高大上,实际上很粗暴。所谓「...
对于 Compose 中的数据,用 mutableStateOf() 包裹来实现监听刷新我们已经轻车熟路。那如果一个数据依赖于另一个或多个数据怎么办?这就用到 derivedStateOf(),它专门用于数据的转换,当上游数据发生变化时会自动刷新下游数据,进一步刷新 UI。有点类似 LiveData 中 Transformations.switchMap 的作用。Show me the co...
第一节.md" >}})就讲到,Compose 过程第一步是「组合」,当变量发生改变时,可能触发「重组」。所谓重组,就是要重新执行我们写的 Compose 代码,为此 Compose 对代码进行了包装。同时为了优化性能,包装一般是比较细粒度的。这是否意味着可以高枕无忧了呢?看下面的代码:var msg = Message("hello") setContent { ...
val name = mutableStateOf("Bob") // 1 val name by mutableStateOf("Bob") // 2 val name by remember { mutableStateOf("Bob") } // 3并且解释了前两个的区别。...
val name = mutableStateOf("Bob") // 1 val name by mutableStateOf("Bob") // 2 val name by remember { mutableStateOf("Bob") } // 3它们之间有什么区别?如何...
DiskLruCache 是一个 Android 端使用广泛的磁盘 LRU (最近最少使用)缓存算法的实现库,甚至在 AOSP 中都有使用。基础使用为了对整体架构有个印象,方便找分析入口,先看看基本的使用。实例化:val cache = DiskLruCache.open(cacheFile, version, valueCount, maxSize)写入:val editor = cach...
自定义 View 同学们一定或多或少都接触过,毕竟设计给出的样式往往从来不是系统默认的🙂。 自定义 View 时往往遵守下面这样的套路:在 attrs.xml 中声明自定义属性(或使用系统预定义属性),经常用 declare-styleable 包裹起来。继承一个 View 并写两个构造函数:constructor(context: Context), constructor(context...