我有一个应用程序,我想在其中添加某种状态,如果添加,我希望我的 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 的东西。因为它永远都是假的。