使用 CompositionLocal 修改父数据时如何触发重组

问题描述

当我使用 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 的值已更改。