问题描述
当我使用 CompositionLocal 时,我已经从父级获取数据并对其进行修改,但我发现它不会触发子级重组。
我已经成功更改了数据,这可以证明,当我在子可组合中添加额外的状态然后将其更改为触发重组时,我可以获得新数据。
有人可以帮我吗?
附加
代码如下
data class GlobalState(var count: Int = 0)
val LocalAppState = compositionLocalOf { GlobalState() }
@Composable
fun App() {
CompositionLocalProvider(LocalAppState provides GlobalState()) {
CountPage(globalState = LocalAppState.current)
}
}
@Composable
fun CountPage(globalState: GlobalState) {
// use it request recomposition worked
// val recomposeScope = currentrecomposeScope
BoxWithConstraints(
contentAlignment = Alignment.Center,modifier = Modifier
.fillMaxSize()
.clickable {
globalState.count++
// recomposeScope.invalidate()
}) {
Text("count ${globalState.count}")
}
}
我发现一种解决方法是使用 currentRecomposable
强制重组,也许有更好的方法,请告诉我。
解决方法
我不确定您为什么以这种方式使用 compositionLocalOf
。
使用 State 提升模式,您可以在可组合中使用两个参数:
-
value: T
:要显示的当前值。 -
onValueChange: (T) -> Unit
:请求更改值的事件,其中 T 是建议的新值。
就你而言:
data class GlobalState(var count: Int = 0)
@Composable
fun App() {
var counter by remember { mutableStateOf(GlobalState(0)) }
CountPage(
globalState = counter,onUpdateCount = {
counter = counter.copy(count = counter.count +1)
}
)
}
@Composable
fun CountPage(globalState: GlobalState,onUpdateCount: () -> Unit) {
BoxWithConstraints(
contentAlignment = Alignment.Center,modifier = Modifier
.fillMaxSize()
.clickable (
onClick = onUpdateCount
)) {
Text("count ${globalState.count}")
}
}
,
当地的成分在这里是一个红鲱鱼。由于 GlobalScope
不是可观察的,因此不会通知组合已更改。最简单的改变就是将GlobalState
的定义修改为,
class GlobalState(count: Int) {
var count by mutableStateOf(count)
}
这将自动通知 compose count
的值已更改。