У меня есть приложение, в которое я хочу добавить какой-то статус, и, если он будет добавлен, я хочу, чтобы мой пользовательский интерфейс отображал снэк-бар, говоря, что он был добавлен. У меня есть хранилище, где я добавляю свой статус. В случае успеха я опубликую это значение в моей ViewModel. Поскольку это снэк-бар, я хочу показать его только один раз, поэтому, если я попытаюсь добавить статус снова, он не достигнет предыдущего состояния, в котором он находился.
Итак, я пытаюсь реализовать рекомендуемый подход из этой статьи: https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150
Итак, в мой проект добавлен класс Event.
Тогда мой репозиторий выглядит примерно так:
private val _statusAdded = MutableLiveData<Event<AbstractRepositoryCallback.ResultState<Boolean>>>()
override val statusAdded: LiveData<Event<AbstractRepositoryCallback.ResultState<Boolean>>> = _statusAdded
val result = _firebaseFunctions.getHttpsCallable("someTable").call(data).awaitResult()
when(result)
{
is Result.Success -> this._statusAdded.postValue(Event(AbstractRepositoryCallback.ResultState(true, null)))
is Result.Error -> this._statusAdded.postValue(Event(AbstractRepositoryCallback.ResultState(false, MessageFactory.getError(R.string.create_status_failed_label))))
}
В моей ViewModel я слушаю эти LiveData следующим образом:
val state: LiveData<DataHolder<Boolean>> = Transformations.switchMap(repository.statusAdded) { data ->
getStatusAdded(data)
}
private fun getStatusAdded(data: Event<AbstractRepositoryCallback.ResultState<Boolean>>): LiveData<DataHolder<Boolean>> {
data.getContentIfNotHandled()?.let {
object : AbstractRepositoryCallback<Boolean>(it) {
override fun onSuccess(data: Boolean) {
liveData.value = DataHolder.success(data)
}
override fun onError(message: IMessage) {
super.onError(message)
liveData.value = DataHolder.error(message)
}
}
}
return liveData
}
Класс DataHolder и AbstractRepositoryCallback - это всего лишь некоторые классы, которые мы сделали, чтобы сделать материал более универсальным, поэтому не обращайте на это внимания.
Во всяком случае, когда я пытаюсь добавить статус здесь, я получаю следующую ошибку:
java.lang.NoClassDefFoundError: Failed resolution of: Ldk/../../ViewModel$getStatusAdded$1$1;
at ../../ViewModel.access$getStatusAdded(ViewModel.kt:53)
Надеюсь, кто-то может мне помочь с тем, что здесь происходит, я новичок в этом LiveData, но я следовал некоторым руководствам по его использованию, и большинство людей говорят, что этот класс Event хорош для Snackbars и т. Д., Он просто Кажется, что большинство примеров от ViewModel до Fragment / Activity, а не чуть раньше.
Я открываю новую ViewModel каждый раз, чтобы она была уничтожена, поэтому я не могу сохранить вещи getContentIfNotHandled из ViewModel. Потому что это всегда будет ложным.