1

我有一个应用程序,我想在其中添加某种状态,如果添加,我希望我的 UI 显示一个小吃栏,说明它已添加。我有一个存储库,可以在其中添加我的状态。如果成功,我会将值发布回我的 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,所以它被破坏了,所以我不能从 ViewModel 中保留 getContentIfNotHandled 的东西。因为它永远都是假的。

4

0 回答 0