Preciso exibir uma mensagem somente quando a operação de adicionar um item no Firebase for concluída. Esta é a função na interface:
suspend fun addItem(item: Item): Response<String>
Esta é a implementação:
override suspend fun addItem(item: Item) = try {
val itemId = itemsRef.add(item).await().id
Response.Success(itemId)
} catch (ex: Exception) {
Response.Failure(ex)
}
No ViewModel eu chamo addItem
assim:
class ItemViewModel @Inject constructor(
private val repo: ItemRepository
): ViewModel() {
private val _addItemResponse = MutableStateFlow<Response<String>>(Response.Success(""))
val addItemResponse: StateFlow<Response<String>> = _addItemResponse.asStateFlow()
fun addItem(item: Item) = viewModelScope.launch {
_addItemResponse.value = Response.Loading
_addItemResponse.value = repo.addItem(item)
}
}
E dentro da IU eu uso:
when(val addItemResponse = viewModel.addItemResponse.collectAsStateWithLifecycle().value) {
is Response.Loading -> CircularProgressIndicator()
is Response.Success -> Toast.makeText(context, addItemResponse.itemId, Toast.LENGTH_LONG).show()
is Response.Failure -> Text(addItemResponse.ex)
}
O problema é que toda vez que inicio o aplicativo, recebo um Toast vazio. Se eu adicionar um item, recebo uma mensagem Toast com o ID do item, que está correto. Mas como mostrar a mensagem Toast somente quando recebo Succes, ou seja, quando os dados são adicionados ao Firebase?
Seu valor inicial é
Response.Success("")
aquele recebido quando a IU começa a coletar; crie um valor inicial diferente que não faça nada em seuwhen
retorno de chamadaTaticamente, seu problema está aqui:
Você está modelando sua resposta como estado, e seu estado padrão é "nós obtivemos sucesso". Parece improvável que seja o caso, pois você ainda não fez o trabalho.
Em vez disso, você precisa de um estado com (pelo menos) quatro opções:
Loading
Success
Failure
WeHaveNotDoneTheThingYet
Seu estado inicial precisa ser
WeHaveNotDoneTheThingYet
, e nesse ramo da sua interface você não faz nada.Além disso, depois de exibir seu
Toast
, você precisa mover o estado deSuccess
back paraWeHaveNotDoneTheThingYet
. Caso contrário, você mostrará oToast
novamente em uma recomposição.