Инспектор макета подъема состояния Jetpack Compose показывает рекомпозицию, даже если она пропущенаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Инспектор макета подъема состояния Jetpack Compose показывает рекомпозицию, даже если она пропущена

Сообщение Anonymous »

Код: Выделить всё

data class MainState(
val changedValue: Int = 0,
val unchangedValue: Int = 0
)

@Composable
fun Composable1(changedValue: Int) {
Text(modifier = Modifier.fillMaxWidth().height(200.dp).background(Color.Green),
text = changedValue.toString())
}

@Composable
fun Composable2(unchangedValue: Int) {
Text(modifier = Modifier.fillMaxWidth().height(200.dp).background(Color.Yellow),
text = unchangedValue.toString())
}

class MainViewModel : ViewModel() {
private val _mainState = MutableStateFlow(MainState())
val mainState = _mainState.asStateFlow()

fun updateState() {
_mainState.value = _mainState.value.copy(changedValue = _mainState.value.changedValue + 1)
}
}

@Composable
fun MainContent(mainState: MainState, onClick: () -> Unit) {
BottomSheetScaffold(modifier = Modifier.fillMaxSize(), sheetContent = {}) {
Column(verticalArrangement = Arrangement.Center) {
Column(verticalArrangement = Arrangement.Center) {
Composable1(changedValue = mainState.changedValue)
Composable2(unchangedValue = mainState.unchangedValue)
}
Button(onClick = { onClick.invoke() }) {
Text(text = "changeState")
}
}
}
}
  • Если новые значения состояния передаются из верхнего Composable — инспектор макета правильно показывает, что Composable2 пропускается, НО он все равно подсвечивается, поскольку он будет перекомпонован, потому что HomeContent перестраивается. Это ошибка в инспекторе макета или ожидаемое поведение? Составной объект был или не был фактически перекомпонован, и можно ли безопасно поднимать такое состояние?

Код: Выделить всё

@Composable MainScreen() {
val viewModel = hiltViewModel()
val mainState by viewModel.mainState.collectAsStateWithLifecycle()
MainContent(mainState = mainState) {
viewModel.updateState()
}
}
Изображение
  • Если я не использую компоновку MainContent между ними, то Composable2 и весь экран не перекрашиваются. Он также правильно отображает, что оно было пропущено. Но я не могу легко просмотреть домашний контент, и в рекомендациях Google это не так. Итак, нормально ли, что инспектор макета перекрашивает весь экран, даже если внутренности Composables пропущены?

Код: Выделить всё

@Composable MainScreen() {
val viewModel = hiltViewModel()
val mainState by viewModel.mainState.collectAsStateWithLifecycle()
BottomSheetScaffold(modifier = Modifier.fillMaxSize(), sheetContent = {}) {
Column(verticalArrangement = Arrangement.Center) {
Column(verticalArrangement = Arrangement.Center) {
Composable1(changedValue = mainState.changedValue)
Composable2(unchangedValue = mainState.unchangedValue)
}
Button(onClick = { viewModel.updateState() }) {
Text(text = "changeState")
}
}
}
Изображение



Подробнее здесь: https://stackoverflow.com/questions/787 ... ven-if-its
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»