這是我的問題;
- 當我在螢屏中添加可組合的 MyText 時,我會看到所有日志(value1、value2、value3),這意味著它正在重新組合我的代碼的每個部分。
- 但是,當我評論 MyText 行時,我在 Logcat 上只看到 value3
我怎樣才能解決這個問題 ?我知道這不是一個大問題,但想象一下我們這里有一個可滾動的 Column 并且我們正在嘗試將 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())
}
編輯 存在主要問題,可滾動列;
@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())
}
uj5u.com熱心網友回復:
這種行為是完全可以預料的。
Compose 試圖盡可能地減少重組的數量。當你注釋掉時MyText,唯一依賴的視圖counter就是Button內容,所以這是唯一需要重構的視圖。
按照同樣的邏輯,你不應該VALUE1多次看到日志,但這里的區別在于Column功能inline,所以如果它的內容需要重新組合 - 它會與包含的視圖一起重新組合。
使用這些知識,您可以輕松地防止視圖被重組:您需要將不依賴于狀態的部分移動到單獨的可組合項中。它使用的事實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.
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/431384.html
標籤:安卓 安卓工作室 android-jetpack-compose android-jetpack-compose-list
