我有一个视图模型,从场景中接收流作为livedata
val state get () = syncScenario.state.asLiveData ()
在活动中,我们订阅了这个livedata,一些逻辑发生并使用了activityResult
private val resultLauncher = registerForActivityResult (activityResult ()) {result ->
when (result.resultCode) {
Activity.RESULT_OK -> sync()
Activity.RESULT_CANCELED -> return
}
}
当我们返回时,我们会用最后一个状态触发一个观察者,并再次执行之前的导航逻辑
private val syncStateObserver = Observer<StateInfo?> {
it?: return@Observer
when (it) {
is Guest -> doWhenUserIsGuest()
is Authorized -> doWhenUserIsAuthorized()
}
}
如何忽略返回时具有相同值的观察者触发器?
这个网址是帮我-https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150
但不适用于livedata。ktx-
我解决了这个问题,通过一个方法,我从流中收集数据,并把它放在我的可变livedata与包装从url
对此有一个流行的答案。您可以将您的StateInfo
包装为SingleCase
类:
open class SingleEvent<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
因此,您的观察者如下所示:
private val syncStateObserver = Observer<SingleEvent<StateInfo>> {
it.getContentIfNotHandled()?: return@Observer
when (it.peek()) {
is Guest -> doWhenUserIsGuest()
is Authorized -> doWhenUserIsAuthorized()
}
}
试图让LiveData与Room一起工作: 因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。
我试图在下面的代码中找出,为什么当我用新数据填充数据库时,Room的LiveData observable没有给我新的班次。 这是放在我的activity的onCreate方法上的: 这是populateAdapter方法: 我还有以下填充数据库的代码(我使用RxJava在IO线程上完成这项工作,因为Room需要在主线程之外调用它的代码): 当我开始观察ShiftsViewModel之后调用per
此外,为什么Viewmodel不能观察到它自己的LiveData的变化?
我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac
我尝试使用这个实现ViewModel。但观察者从未被调用。 基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。 我在这里做错了什么? BookActivity类: BookViewModel类