当前位置: 首页 > 知识库问答 >
问题:

不需要时触发LiveData观察者

皇甫繁
2023-03-14

我有一个视图模型,从场景中接收流作为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()
        }
    }

如何忽略返回时具有相同值的观察者触发器?

共有2个答案

祁建明
2023-03-14

这个网址是帮我-https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150

但不适用于livedata。ktx-

我解决了这个问题,通过一个方法,我从流中收集数据,并把它放在我的可变livedata与包装从url

公西培
2023-03-14

对此有一个流行的答案。您可以将您的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类