如何更新 mutablestate uistate 以设置视图模型中的当前选定项目?我有这个 uistate 类,需要更改 selectedBookId 值。
sealed interface BooksGridUiState {
data class Success(
val booksList: List<BookData>,
val selectedBookId: String?
) : BooksGridUiState
object Error : BooksGridUiState
object Loading : BooksGridUiState
}
这是视图模型中的变量:
var uiState: BooksGridUiState by mutableStateOf(BooksGridUiState.Loading)
private set
无法完成打电话的技巧
.update {
it.copy(
因为这不是 mutablestateflow,而且我正在关注 codelab 并且必须使用 mutablestate (editado)
这样做正确吗?
fun selectBook(id: String) {
(uiState as BooksGridUiState.Success).let {
uiState = BooksGridUiState.Success(it.booksList, id)
}
}
也许这样做更好?
fun selectBook(id: String) {
(uiState as BooksGridUiState.Success).let {
uiState = it.copy(selectedBookId = id)
}
}
用这个:
您说您这样做是因为您遵循 Codelab。如果仅用于学术目的,这种方法是可以的,但在任何实际应用程序中,您不应该在视图模型中使用 Compose State,而应该使用 MutableStateFlow。
关于您对问题的更新:如果您只是想忽略当前状态的情况
Error
,Loading
那么我会建议您的第二个提议的解决方案的变体:我使用了
as?
with ,如果不能转换为( and就是这种情况),?
则不会因运行时异常而失败。相反,它将返回 null,以便完全跳过以下内容。uiState
Success
Error
Loading
?.let