【发布时间】:2022-11-03 18:52:55
【问题描述】:
我的 ViewModel 中有一个 ScreenState 数据类:
data class ScreenState(
var isLoading: Boolean = true,
val items: List<Posts> = emptyList()
)
和一个可变状态:
private val _homeScreenState = mutableStateOf(ScreenState())
val homeScreenState: State<ScreenState> = _homeScreenState
更新 isLoading 属性可以正常工作,更改会发送到我的 UI:
_homeScreenState.value = _homeScreenState.value.copy(isLoading = true)
但是更新我的List<Posts> 中的项目不起作用。
这是我尝试这样做的方法:
val updatedList = homeScreenState.value.items.toMutableList()
val index = updatedList.indexOfFirst { it.id == passedPost.id }
updatedList[index] = updatedList[index].copy(isLiked = true)
_homeScreenState.value = _homeScreenState.value.copy(items = updatedList)
我正在尝试更新我的 Post 数据类中的 isLiked Boolean 并在 UI 中显示更改。
我明白,这是正常行为,mutableStateOf 不会更新,因为 ScreenState 本身不会更新,而是 ScreenState 的 List<Post> 内的项目。
问题是我不知道如何触发 UI 更新。
编辑这是我的帖子数据类:
data class Post(
val id: Int,
val name: String,
val description: String,
val isLiked: Boolean = false,
)
【问题讨论】:
-
Posts是数据类吗?或者,一般来说,它是否实施了适当的equals? -
你可以试试这个吗? _homeScreenState.value = _homeScreenState.value.copy(items = _homeScreenState.value.items.toMutableList().also { it[index] = _homeScreenState.value.items[index].copy(isLike = true) } )
-
@gpunto 它是一个数据类,我用它更新了我的问题
-
@commandiron 不幸的是,这也不起作用
-
我在您发布的代码中看不到问题,所以我猜它在其他地方。你是如何观察状态的?
标签: android kotlin android-jetpack-compose kotlin-coroutines