gpt4 book ai didi

android - Jetpack Compose Recomposition 每次状态改变

转载 作者:行者123 更新时间:2023-12-02 18:18:33 30 4
gpt4 key购买 nike

这是我的问题;

  • 当我在我的屏幕中添加 MyText 可组合项时,我看到了所有日志(值 1、值 2、值 3),这意味着它正在重构我的代码的每个部分。
  • 但是,当我评论 MyText 行时,我在 Logcat 上只看到 value3

我该如何解决这个问题?我知道这不是一个大问题,但想象一下我们这里有一个可滚动的列,我们正在尝试将 ScrollState.value 传递给 My Text 组件。由于这种情况,我们的列表变得非常滞后。

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Screen()
}
}
}

@Composable
fun Screen(){
var counter by remember {
mutableStateOf(0)
}
Log.i("RECOMPOSE","VALUE1")
Column() {
Text(text = "Just a text")
Log.i("RECOMPOSE","VALUE2")
Button(onClick = { counter = counter.plus(1) }) {
Text(text = counter.toString())
Log.i("RECOMPOSE","VALUE3")
}
MyText(counter)
}
}
@Composable
fun MyText(counter:Int){
Text(text = counter.toString())
}

编辑Scrollable Column 存在主要问题;

@Composable
fun Screen(){
val scrollState = rememberScrollState()
Box() {
Column(modifier = Modifier
.verticalScroll(scrollState)
.padding(top = 50.dp)) {
//Some Static Column Elements with images etc.
}
MyText(scrollStateValue = scrollState.value) //Doing some UI staff in this component
}
}
@Composable
fun MyText(scrollStateValue:Int){
Text(text = scrollStateValue.toString())
}

最佳答案

这种行为完全符合预期。

Compose 正在尝试尽可能减少重组次数。当您注释掉 MyText 时,唯一依赖于 counter 的 View 是 Button 内容,因此这是唯一需要重构的 View 。

按照同样的逻辑,你不应该多次看到 VALUE1 日志,但这里的区别是 Columninline 函数,因此,如果它的内容需要重新组合 - 它会与包含的 View 一起重新组合。

利用这些知识,您可以轻松地防止 View 被重组:您需要将不依赖于状态的部分移动到一个单独的可组合项中。它使用 scrollState 的事实不会使其重组,只有读取状态值才会触发重组。

@Composable
fun Screen(){
val scrollState = rememberScrollState()
Box() {
YourColumn(scrollState)
MyText(scrollStateValue = scrollState.value) //Doing some UI staff in this component
}
}

@Composable
fun YourColumn(scrollState: ScrollState){
Column(modifier = Modifier
.verticalScroll(scrollState)
.padding(top = 50.dp)) {
//Some Static Column Elements with images etc.
}
}

关于android - Jetpack Compose Recomposition 每次状态改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71208130/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com