【发布时间】:2020-09-20 20:51:46
【问题描述】:
我的问题是使用正确的数据触发了实时数据观察者Observer<T> { state.value = it },但撰写并没有启动重组。只有当我添加一个项目时,所有更改才会传播。如果列表发生了变化,必须对列表本身进行一些检查。我猜它不比较列表项。
@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 )
}
【问题讨论】:
-
MutableList可能是您的问题。一般来说,可变类型对 Compose 来说并不是一件好事。你是怎么修改items的? -
它通过 Room 和 Viewmodel 并且都正确更新并且观察者看到了。
-
好吧,因为我看不到那个代码,所以我不能真正评论它。在摘要中,我建议避免使用
MutableList和var。 -
如果我在从数据库中获取项目后输入
.shuffled(),所有更改都会反映(当然顺序不同)。
标签: android kotlin android-jetpack-compose