前言
因为安卓的ComposeUI会不断刷新代码块中的代码,所以在ComposeUI中不能直接创建复杂变量,否则在实际运行中会随着代码刷新,不断重复创建这个变量。------这好像是响应式编程(声明式UI)中的一个特点。(如果是临时保存字符串或整数的变量,则无所谓,但比较大的复杂变量肯定是不好直接创建的)
需要使用一个缓存将变量保存起来。这样,ComposeUI刷新代码的时候,就不会无故刷新缓存中的变量。
代码
1、最开始的缓存变量
Kotlin
// 1、定义一个复杂类案例:
import android.util.Log
class AAA(val str: String = "hello") {
fun speek(name: String) {
Log.e("AAA", str + " " + name)
}
}
// 2、使用缓存:
val aaa = remember { mutableStateOf(AAA()) }
// remember负责创建缓存。这个缓存和当前Compose组件绑定,当前Compose组件被销毁,缓存也会被销毁。mutableStateOf提供一个可监测变量变化的功能,即如果aaa.value发生变化,系统会重新刷新使用这个缓存的Compose组建。value值自身发生的变化不会触发刷新,只有aaa.value被重新赋值,才会触发刷新。
// 3、从缓存中调用AAA类
aaa.value = AAA("hi")
aaa.value.speek("bob")
2、ViewModel
Kotlin
import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
// 1.定义类
class AAA(val str: String = "hello") {
fun speek(name: String) {
Log.e("AAA", str + " " + name)
}
}
// 2.定义ViewModel。ViewModel起到remember缓存的作用,只是缓存到整个Activity上面,只有Activity被删除,ViewModel的缓存才会删除,比如重启应用、后台杀进程。ViewModel中不能使用remember。
class AAAViewMode() : ViewModel() {
var aaa by mutableStateOf(AAA())
fun editAAA(str: String) {
aaa = AAA(str)
}
}
// by关键字起到=号的作用,=号是拥有变量,by是左边的操作委托给右边。by关键字需要右边对象拥有getValue和setValue方法,然后对by左边的=号会被委托给setValue方法,直接使用会被委托给getValue方法。
// 3.创建ViewModel。
val aVM by lazy {
ViewModelProvider(this)[AAAViewMode::class.java]
}
// 4.使用ViewModel
Log.e("VM",aVM.aaa.str)
aVM.aaa = AAA("hi")
// 给by关键字左边变量赋值会被委托给setValue方法,其余的委托给getValue方法。by可以看作是=号的特殊语法糖,比如,var a by b,本质上没有a这个变量,a的赋值和获取操作会被委托给setValue和getValue。
其他缓存
ComposeUI中的缓存体系非常成熟与常见,其他缓存暂略。