功能:实现一个商品列表的搜索框功能
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)
}