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

wjp*_*oop 0 android kotlin android-jetpack-compose composable compose-recomposition

当我使用 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}")
    }
}

Run Code Online (Sandbox Code Playgroud)

我发现一个解决方法是使用currentRecomposable强制重组,也许有更好的方法,请告诉我。

chu*_*ckj 6

当地的构图在这里是一个转移注意力的话题。由于GlobalScope组合物不可观察,因此不会通知其发生变化。最简单的更改是修改 to 的定义GlobalState

class GlobalState(count: Int) {
   var count by mutableStateOf(count)
}
Run Code Online (Sandbox Code Playgroud)

这将自动通知 compose 的值count已更改。