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 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") } } } } [/code] [list] [*]Если новые значения состояния передаются из верхнего Composable — инспектор макета правильно показывает, что Composable2 пропускается, НО он все равно подсвечивается, поскольку он будет перекомпонован, потому что HomeContent перестраивается. Это ошибка в инспекторе макета или ожидаемое поведение? Составной объект был или не был фактически перекомпонован, и можно ли безопасно поднимать такое состояние? [/list] [code]@Composable MainScreen() { val viewModel = hiltViewModel() val mainState by viewModel.mainState.collectAsStateWithLifecycle() MainContent(mainState = mainState) { viewModel.updateState() } } [/code] [img]https://i.sstatic.net/6KeHWSBM.gif[/img]
[list] [*]Если я не использую компоновку MainContent между ними, то Composable2 и весь экран не перекрашиваются. Он также правильно отображает, что оно было пропущено. Но я не могу легко просмотреть домашний контент, и в рекомендациях Google это не так. Итак, нормально ли, что инспектор макета перекрашивает весь экран, даже если внутренности Composables пропущены? [/list] [code]@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") } } } [/code] [img]https://i.sstatic.net/GzjCYMQE.gif[/img]
У меня есть простой составной элемент, подобный этому, который отображает список Int и имеет кнопку, которая изменяет список на другой список с обратным порядком:
@Composable
fun Test() {
var list by remember { mutableStateOf(listOf(1, 2, 3)) }...
Я разрабатываю приложение для Android с использованием Jetpack Compose и архитектуры MVVM. Когда я нажимаю кнопку «Добавить», в список добавляется новая заметка, но пользовательский интерфейс не перестраивается для отображения новой заметки.
Вот мой...
Я разрабатываю приложение для Android с использованием Jetpack Compose и архитектуры MVVM. Когда я нажимаю кнопку «Добавить», в список добавляется новая заметка, но пользовательский интерфейс не перестраивается для отображения новой заметки.
Вот мой...
Я разрабатываю приложение для Android с использованием Jetpack Compose и архитектуры MVVM. Когда я нажимаю кнопку «Добавить», в список добавляется новая заметка, но пользовательский интерфейс не перестраивается для отображения новой заметки.
Вот мой...
Я столкнулся с проблемой в Jetpack Compose, из-за которой рекомпозиция кажется неэффективной при использовании оператора if, хотя результирующий компонуемый объект тот же. Вот упрощенные примеры:
Пример 1: Рекомпозиция триггеров
when (theme) {...