我正在尝试使用 LazyColumn 在列表中显示订单列表。这是代码:
@Composable
private fun MyOrders(
orders: List<Order>?,
onClick: (String, OrderStatus) -> Unit
) {
orders?.let {
LazyColumn {
items(
items = it,
key = { it.id }
) {
OrderDetails(it, onClick)
}
}
}
}
@Composable
private fun OrderDetails(
order: Order,
onClick: (String, OrderStatus) -> Unit
) {
println("Composing Order Item")
// Item Code Here
}
这是方法,我称之为可组合:
orderVm.fetchOrders()
val state by orderVm.state.collectAsState(OrderState.Empty)
if (state.orders.isNotEmpty()) {
MyOrders(state.orders) {
// Handle status change click listener
}
}
我获取所有订单并显示在 LazyColumn 中。但是,当更新单个订单时,整个 LazyColumn 都会重新组合。这是我的 ViewModel 的样子:
class OrderViewModel(
fetchrderUseCase: FetechOrdersUseCase,
updateStatusUseCase: UpdateorderUseCase
) {
val state = MutableStateFlow(OrderState.Empty)
fun fetchOrders() {
fetchrderUseCase().collect {
state.value = state.value.copy(orders = it.data)
}
}
fun updateStatus(newStatus: OrderStatus) {
updateStatusUseCase(newStatus).collect {
val oldOrders = status.value.orders
status.value = status.value.copy(orders = finalizeOrders(oldOrders))
}
}
}
注意:finalizeOrders()
会根据 orderId 进行一些列表操作,以使用更新后的订单更新订单。
这就是我的状态:
data class OrderState(
val orders: List<Order> = listOf(),
val isLoading: Boolean = false,
val error: String = ""
) {
companion object {
val Empty = FetchOrdersState()
}
}
如果我的数据库中有 10 个订单并且我更新了一个状态(比如说第 5 个项目),那么OrderDetails
会被调用 20 次。不知道为什么。我可以优化它以确保只有第 5 个索引项将被重新组合,并且OrderDetals
仅使用新订单调用。