compose viewModel状态容器中list类型state无法触发界面重组的问题

358 阅读1分钟

功能:实现一个商品列表的搜索框功能

vm中的状态容器:

data class CommodityUiState(
    // 轮播图商品列表,默认为 carouselItemList
    val carouselItems: List<ProductCarouselItem> = carouselItemList,
    // 商品分类列表,默认为 commodityTypesMock
    val commodityTypes: List<CommodityType> = commodityTypesMock,
    // 搜索框是否打开,默认为 false
//    val isOpenSearchBox: Boolean = false,
    // 搜索框的值,默认为空字符串
    val searchBoxValue: String = "",
    // 购物车中的商品列表,默认为 shoppingCartCommodityListMock
    val shoppingCartCommodityList: List<Commodity> = shoppingCartCommodityListMock,
    // 原始商品列表,默认为空列表
    val commoditiesOrigin: List<Commodity> = emptyList(),
    // 显示的商品列表,默认为空可变的 SnapshotStateList<Commodity>
    var showCommodities: SnapshotStateList<Commodity> = mutableStateListOf()
) {
    // 商品总价
    val total = commodityTypes[0].commodities.sumOf {
        it.totalPrice
    }
}

问题:uiState中的showCommodities为需要展示的商品列表,当其类型为普通list时。按照更新普通数据类型的通常做法,无法让组件自动重组。

_uiState.value = _uiState.value.copy(showCommodities = commodities)

解决方法:将list的类型改为SnapshotStateList,并且使用clear()等函数进行正删改查。使用=也不行。

_uiState.value.showCommodities.apply {
    clear()
    addAll(commodities)
}