当列表项 属性 更改时,Livedata 不更新撰写状态
Livedata don't update compose state when list item property has changed
我的问题是使用正确的数据触发了实时数据观察器 Observer<T> { state.value = it }
,但 compose 不会在 recompose 时启动。只有当我添加一个项目时,所有更改才会传播。如果列表已更改,则必须对列表本身进行一些检查。我想它不会比较列表项。
@Composable
fun <R, T : R> LiveData<T>.observeAsState(initial: R): State<R> {
val lifecycleOwner = LifecycleOwnerAmbient.current
val state = remember { mutableStateOf(initial) }
onCommit(this, lifecycleOwner) {
val observer = Observer<T> { state.value = it }
observe(lifecycleOwner, observer)
onDispose { removeObserver(observer) }
}
return state
}
val items: List<TrackedActivityWithMetric> by vm.activities.observeAsState(mutableListOf())
LazyColumnForIndexed(
items = items,
Modifier.padding(8.dp)
) { index, item ->
....
MetricBlock(item.past[1], item.activity.id )
}
所以在幕后必须有某种哈希比较机制来防止渲染相同的项目两次(需要更详细的答案)。渲染不正确是由 属性 引起的,它不在 TrackedActivityWithMetric
数据 class 构造函数中。
Jetpack Compose 不适用于 MutableList,您需要使用 List 并执行如下操作:
var myList: List<MyItem> by mutableStateOf(listOf())
private set
用于添加项目:
fun addItem(item: MyItem) {
myList = myList + listOf(myItem)
}
用于编辑项目:
fun editItem(item: MyItem) {
val index = myList.indexOf(myItem)
myList = myList.toMutableList().also {
it[index] = myItem
}
}
我的问题是使用正确的数据触发了实时数据观察器 Observer<T> { state.value = it }
,但 compose 不会在 recompose 时启动。只有当我添加一个项目时,所有更改才会传播。如果列表已更改,则必须对列表本身进行一些检查。我想它不会比较列表项。
@Composable
fun <R, T : R> LiveData<T>.observeAsState(initial: R): State<R> {
val lifecycleOwner = LifecycleOwnerAmbient.current
val state = remember { mutableStateOf(initial) }
onCommit(this, lifecycleOwner) {
val observer = Observer<T> { state.value = it }
observe(lifecycleOwner, observer)
onDispose { removeObserver(observer) }
}
return state
}
val items: List<TrackedActivityWithMetric> by vm.activities.observeAsState(mutableListOf())
LazyColumnForIndexed(
items = items,
Modifier.padding(8.dp)
) { index, item ->
....
MetricBlock(item.past[1], item.activity.id )
}
所以在幕后必须有某种哈希比较机制来防止渲染相同的项目两次(需要更详细的答案)。渲染不正确是由 属性 引起的,它不在 TrackedActivityWithMetric
数据 class 构造函数中。
Jetpack Compose 不适用于 MutableList,您需要使用 List 并执行如下操作:
var myList: List<MyItem> by mutableStateOf(listOf())
private set
用于添加项目:
fun addItem(item: MyItem) {
myList = myList + listOf(myItem)
}
用于编辑项目:
fun editItem(item: MyItem) {
val index = myList.indexOf(myItem)
myList = myList.toMutableList().also {
it[index] = myItem
}
}