Column( Modifier.verticalScroll(rememberScrollState()) ) { dataList.reversed().forEach затем, когда добавляется новый элемент, его счетчик не создается с 0, как предполагалось, а берется из предыдущий элемент, и предыдущий элемент обновляет счетчик до 0, хотя он должен только продолжать подсчитывать свои очки. Как мне обойти ограничения этих двух подходов и найти золотую середину?
Код: Выделить всё
@Composable
fun ColumnWithDynamicItems(
dataList: List
) {
val savedState = remember { mutableStateMapOf() }
val itemStates = remember { mutableStateMapOf() }
val mutex = Mutex()
LazyColumn(
reverseLayout = true
) {
items(dataList) {message ->
if (message.progressDelivered != 1f) {
LaunchedEffect(key1 = message.id) {
var timerValue = savedState[message.id] ?: 0
while (isActive && itemStates[message.id] == true) {
mutex.withLock {
savedState[message.id] = timerValue + 1
timerValue++
delay(1000L)
}
}
}
}
DispatcherItems(
message = message,
savedState = savedState,
onStateChange = { isActive ->
itemStates[message.id] = isActive
Log.d("testet", " - Column id ${itemStates[message.id]} active $isActive")
}
)
}
}
}
однако, если вы используете этот код
Код: Выделить всё
@Composable
fun ColumnWithDynamicItems(
dataList: List
) {
val savedState = remember { mutableStateMapOf() }
val itemStates = remember { mutableStateMapOf() }
val mutex = Mutex()
Column(
Modifier.verticalScroll(rememberScrollState())
) {
dataList.reversed().forEach { message ->
if (message.progressDelivered != 1f) {
LaunchedEffect(key1 = message.id) {
var timerValue = savedState[message.id] ?: 0
while (isActive && itemStates[message.id] == true) {
mutex.withLock {
savedState[message.id] = timerValue + 1
timerValue++
delay(1000L)
}
}
}
}
DispatcherItems(
message = message,
savedState = savedState,
onStateChange = { isActive ->
itemStates[message.id] = isActive
Log.d("testet", " - Column id ${itemStates[message.id]} active $isActive")
}
)
}
}
}
Эти два варианта имеют свои недостатки. Как мне объединить код, чтобы при добавлении элементов таймер начинался с 0, и чтобы предыдущие элементы не обновляли таймер и чтобы при прокрутке элементы не обновляли свой таймер при выходе из области видимости?
Код: Выделить всё
@Composable
fun DispatcherItems(
message: MessageType,
savedState: MutableMap,
onStateChange: (Boolean) -> Unit
) {
val expanded = remember { mutableStateOf(false) }
val heightItemExpanded = if (expanded.value) 50.dp else 90.dp
val heightItemExpandedProgress = if (expanded.value) 20.dp else 45.dp
val secondsValueState = remember { mutableStateOf(savedState[message.id] ?: 0) }
val secondsValue = secondsValueState.value
val job = remember {
mutableStateOf(null)
}
LaunchedEffect(key1 = secondsValue) {
if (message.progressDelivered != 1f) {
job.value = launch {
while (isActive) {
delay(1000L)
secondsValueState.value = secondsValue + 1
}
}
}
}
expanded.value = message.progressDelivered == 1f
Подробнее здесь: https://stackoverflow.com/questions/787 ... th-a-timer