Код: Выделить всё
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