Сбой LiveData и Transformations.switchMap - PullRequest
1 голос
/ 02 апреля 2019

У меня есть приложение, в которое я хочу добавить какой-то статус, и, если он будет добавлен, я хочу, чтобы мой пользовательский интерфейс отображал снэк-бар, говоря, что он был добавлен. У меня есть хранилище, где я добавляю свой статус. В случае успеха я опубликую это значение в моей 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. Потому что это всегда будет ложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...