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