问题场景
首先有一个带key的remember mutableState。
var dataState by remember(key1 = key1) {
mutableStateOf(Data())
}
然后在一个pointerInput里调用/修改这个dataState
Image(
modifier = Modifier.pointerInput(Unit) {
detectDragGestures(
onDragEnd = {
dataState = dataState.reset()
},
onDrag = { change, dragAmount ->
change.consume()
dataState = dataState.moveAndScale(dragAmount)
}
)
}
)
在key1变化之后,会发现detectDragGestures里的操作无效
原因
pointerInput会创建一个闭包,如果pointerInput的key不变,闭包里拿到的就只有dataState的旧值。
注意⚠️这里的旧值,指的是旧的mutableState而不是mutableState.get。
这里详细了解要看by remember语法糖
所以在remember的key1变了之后,闭包外的composable根据新的mutableState来get/set。而闭包内的仍是对旧的mutableState进行操作,就会表现为手势操作看起来没有变化。
思路来源:https://stackoverflow.com/questions/72299963/value-of-mutablestate-captured-by-remember-with-keys-doesnt-get-updated-if-reme