Composable не покидает композицию, даже если его данные меняют положение после установки нового списка путем фильтрации Android

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

Сообщение Anonymous »

Я анимирую элементы, когда они входят в композицию внутри FlowRow, это также происходит и в LazyColumn/Row, Column. Когда пользователь фильтрует, получает данные из списка по умолчанию и отображает элементы на основе некоторых критериев фильтра. Однако некоторые элементы не покидают композицию и не входят в нее, поэтому их LaunchedEffect(Unit) никогда не вызывается.
Я пытался изменить данные, чтобы они были нестабильными, переопределение равно возврату false, использование копии для передачи новых ссылок, обновление некоторого идентификатора для проверки отображения старых данных, использование SnapshotStateList, как в фактической реализации, с очисткой и добавлением элементов, но даже с новыми данными Composable не удаляются, и потому что из них не компонуются и не анимируются после фильтрации.
Изображение

@Preview
@Composable
fun Test() {
val viewModel = viewModel()
MyComposable(viewModel)
}

@Composable
fun MyComposable(someViewModel: SomeViewModel) {

Column {

Button(
modifier = Modifier.padding(16.dp).fillMaxWidth(),
onClick = {
someViewModel.filter()
}
) {
Text("Filter")
}

val itemList = someViewModel.itemList

BoxWithConstraints(
modifier = Modifier.padding(horizontal = 16.dp)
) {

val itemWidth = (maxWidth - 8.dp) / 2

FlowRow(
modifier = Modifier.fillMaxSize(),
maxItemsInEachRow = 2,
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {

itemList.forEach {
key(it.id) {
MyRow(
modifier = Modifier.size(itemWidth),
item = it
)
}
}

}
}
}
}

@Composable
fun MyRow(
modifier: Modifier = Modifier,
item: SomeData,
) {

var visible by remember {
mutableStateOf(false)
}

var counter by remember {
mutableIntStateOf(0)
}

LaunchedEffect(Unit) {
println("Composing $item")
visible = true
}

val context = LocalContext.current

DisposableEffect(Unit) {
onDispose {
Toast.makeText(context, "Item ${item.id} is leaving composition", Toast.LENGTH_SHORT).show()
}
}

AnimatedVisibility(
visible = visible,
enter = fadeIn(
tween(300)
) + scaleIn(
tween(300)
)
) {
Column(
modifier = modifier
.shadow(2.dp, RoundedCornerShape(16.dp))
.background(Color.White, RoundedCornerShape(16.dp))
.padding(16.dp)
) {
Text("id: ${item.id}, value: ${item.value}")
Spacer(modifier = Modifier.weight(1f))
Button(
modifier = Modifier.fillMaxWidth(),
onClick = {
counter++
}
) {
Text("Counter: $counter")
}
}
}
}

class SomeViewModel : ViewModel() {

private val list = listOf(
SomeData(id = "1", value = "Row1"),
SomeData(id = "2", value = "Row2"),
SomeData(id = "3", value = "Row3"),
SomeData(id = "4", value = "Row4"),
SomeData(id = "5", value = "Row5")
)

var itemList by mutableStateOf(list)

private var counter: Int = 0

fun filter() {
if (counter % 3 == 0) {
itemList = listOf(
list[0],
list[1],
list[2]
)
} else if (counter % 3 == 1) {
itemList = listOf(
list[1],
list[2]
)
} else {
itemList = listOf(
list[2],
list[3]
)
}

counter++
}
}

data class SomeData(val id: String, val value: String)

Еще один образец с уникальным идентификатором и функцией копирования для передачи новых ссылок.
[img]https: //i.sstatic.net/jtL0jgeF.gif[/img]

class SomeViewModel : ViewModel() {

private val list = listOf(
SomeData(id = "1", value = "Row1"),
SomeData(id = "2", value = "Row2"),
SomeData(id = "3", value = "Row3"),
SomeData(id = "4", value = "Row4"),
SomeData(id = "5", value = "Row5")
)

var itemList by mutableStateOf(list)

private var counter: Int = 0

fun filter() {
if (counter % 3 == 0) {
itemList = listOf(
list[0].copy(uniqueId = UUID.randomUUID().toString()),
list[1].copy(uniqueId = UUID.randomUUID().toString()),
list[2].copy(uniqueId = UUID.randomUUID().toString())
)
} else if (counter % 3 == 1) {
itemList = listOf(
list[1].copy(uniqueId = UUID.randomUUID().toString()),
list[2].copy(uniqueId = UUID.randomUUID().toString())
)
} else {
itemList = listOf(
list[2].copy(uniqueId = UUID.randomUUID().toString()),
list[3].copy(uniqueId = UUID.randomUUID().toString())
)
}

counter++
}
}

data class SomeData(val id: String, val value: String, var uniqueId:String = "")


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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Jetpack Compose: когда Coroutine-Scope покидает композицию?
    Anonymous » » в форуме Android
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • JetPack Compose: Когда коратика покидает композицию?
    Anonymous » » в форуме Android
    0 Ответы
    0 Просмотры
    Последнее сообщение Anonymous
  • В веб-приложении Blazor (.NET 8) ссылки не меняют положение прокрутки.
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Переменные PHP меняют положение заголовков HTML
    Anonymous » » в форуме Php
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Переменные PHP меняют положение заголовков HTML
    Anonymous » » в форуме CSS
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

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