撰写:LazyColumn 在单个项目更新时重组所有项目

2024-03-22

我正在尝试使用 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仅根据新订单被调用。


Is the Order班级表?如果不是,这可能是所有项目被重组的原因:

如果所有输入都是,Compose 会跳过可组合项的重组稳定且没有改变。比较使用equals方法

本节 https://developer.android.com/jetpack/compose/lifecycle#skipping在撰写的文档中解释了什么是stable类型以及如何跳过重组。

Note:如果滚动惰性列表,所有不可见的项目都将被销毁。这意味着如果您向后滚动,它们将被重新创建而不是重新组合(即使输入是,您也不能跳过重新创建)stable).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

撰写:LazyColumn 在单个项目更新时重组所有项目 的相关文章

随机推荐