Como atualizar um uistate mutablestate para definir o item selecionado atual em um viewmodel? Eu tenho essa classe uistate e preciso alterar o valor de selectedBookId.
sealed interface BooksGridUiState {
data class Success(
val booksList: List<BookData>,
val selectedBookId: String?
) : BooksGridUiState
object Error : BooksGridUiState
object Loading : BooksGridUiState
}
Esta é a variável no viewmodel:
var uiState: BooksGridUiState by mutableStateOf(BooksGridUiState.Loading)
private set
Não consigo fazer o truque de ligar
.update {
it.copy(
Porque este não é um mutablestateflow e estou seguindo um codelab e preciso usar mutablestate (editado)
é correto fazer assim?
fun selectBook(id: String) {
(uiState as BooksGridUiState.Success).let {
uiState = BooksGridUiState.Success(it.booksList, id)
}
}
talvez seja melhor fazer assim?
fun selectBook(id: String) {
(uiState as BooksGridUiState.Success).let {
uiState = it.copy(selectedBookId = id)
}
}
Usa isto:
Você disse que está fazendo isso porque segue um Codelab. Essa abordagem é adequada se for usada apenas para fins acadêmicos, mas em qualquer aplicativo do mundo real você não deve usar um Compose State em seu modelo de visualização; em vez disso, deve usar um MutableStateFlow.
Em relação à sua atualização para a pergunta: Se você deseja apenas ignorar os casos em que está o estado atual
Error
ouLoading
então sugiro uma variação da sua segunda solução proposta:Eu usei
as?
com um?
que não falhará com uma exceção de tempo de execução seuiState
não puder ser convertidoSuccess
(que é o caso deError
eLoading
). Em vez disso, ele retornará null para que o seguinte?.let
seja totalmente ignorado.