derivedStateOf
官方解释
- 将一个或多个状态对象转换为其他状态
我的解释
- 结合remember使用。
- 作用是能够将多个可变更的状态绑定起来,并且在这多个可变更的状态,发生任意变化的时候,重新执行初始化逻辑,返回给remember
// 当且仅当 todoTasks 或者 highPriorityKeywords发生变化,会重新赋值通知给highPriorityTasks
val highPriorityTasks by remember(highPriorityKeywords) {
derivedStateOf { todoTasks.filter { it.containsWord(highPriorityKeywords) } }
}
Demo用例
derivedStateOf和remember(args)
setContent {
var name by remember { mutableStateOf("ryanhuen") }
var processName by remember { derivedStateOf(name.uppercase()) }
Text(processName , Modifier.clickable{
name = "ryanhuen rock'n'roll"
})
}
- 只要name数据发生改变,一定会通知processName变更,达到Text()刷新的效果
- 但是从上面的使用案例来看,这两种用法,其实效果上差不多。
var processName by remember { derivedStateOf(name.uppercase()) }
var processName = remember { name.uppercase() }
- 如果使用上面的方式,我们运行程序,得到的结果是一样的,因为两者都是监听name的改变。
当列表比较
- 我们改动一下代码
var nameList = remember {
mutableStateListOf("ryanhuen", "ryanhuen rock")
}
var processNameList = remember(nameList) {
nameList.map {
it.uppercase()
}
}
- remember面对List进行比较的时候,就会失效了。因为remember虽然做的是同样的,针对List做equals比较。
- 但是区别于对象来说,List的equals在比较的时候,内部没有做过快照一类的存储,因此在比较的时候,实际上拿的是同一时刻,完全equals的两个相同的List进行equals比较。
- 结果自然一定是true的,所以,在这种时候,带参数的remember()就失效了。