【问题标题】:Jetpack Compose - mutableStateOf() not updatingJetpack Compose - mutableStateOf() 未更新
【发布时间】: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&lt;Posts&gt; 中的项目不起作用。 这是我尝试这样做的方法:

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&lt;Post&gt; 内的项目。

问题是我不知道如何触发 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


【解决方案1】:
data class Post(
    val id: Int,
    val name: String,
    val description: String,
    val isLiked: MutableState<Boolean> = mutableStateOf(false),
)

或者

class Post(
    val id: Int,
    val name: String,
    val description: String,
    isLiked: Boolean = false,
){

    val isLiked by mutableStateOf(isLiked)

}

【讨论】:

  • 我试过了,但它仍然没有反映 UI 中的变化,当我向下滚动列表然后向上滚动或切换到新屏幕时,它只会在重新组合时更新
  • State<T> 属性中的更新应触发 UI 重构
【解决方案2】:

您可以使用快照突变策略控制结果如何可变状态报告并合并对状态对象的更改。在这里看看我的回答:

https://stackoverflow.com/a/74301717/8389251

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2023-01-14
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多