【问题标题】:Why MediatorLiveData does not observe two different sources?为什么 MediatorLiveData 没有观察到两个不同的来源?
【发布时间】:2020-07-09 20:50:54
【问题描述】:

我有两个房间查询。

@Query("Select * from accountGroup")
fun getAll(): LiveData<List<AccountGroupDto>>


@Query("Select * from accounts")
fun getAll(): LiveData<List<AccountDto>>

通过这 2 个结果列表,我想创建一个新的 ShareItem 列表

data class ShareItem
(val accountId: Int, val accountGroupId: Int, val isGroup: Boolean)

我想在我的活动中观察它的组合列表。 所以我有一个实现 MediatorLiveData 的存储库,它添加了两个源,我希望每个项目都进行转换(创建一个 ShareItem)并将其添加到 mutableLiveData 并将其提供给 viewModel。

override fun getShareItems(): LiveData<List<Int>> {
        val shareItems = MutableLiveData<List<ShareItem>>()
        val liveDataMerger = MediatorLiveData<List<Int>>()
                
        liveDataMerger.addSource(accountGroupsDao.getAll()) {  groups ->
            // Transform each element in ShareItem ??
            println("Group log")
        }
        liveDataMerger.addSource(accountsDao.getAll()) { accounts ->
            // Transform each element in ShareItem ??
            println("Account log")
        }
        
        return shareItems
    }

但是我从未在控制台中看到 System.out。由于数据库显然充满了数据,我错过了什么?

【问题讨论】:

  • 您将来源添加到liveDataMerger,但返回shareItems
  • 重点是我在 Logcat 中看不到和 System.out。好像什么都没有叫
  • 因为你没有观察到liveDataMerger LiveData。 “仅当此 MediatorLiveData 处于活动状态时才会调用 onChanged 回调 (lambda)”。
  • IR42 是对的。我必须在 liveDateMerger 中添加组/帐户

标签: android kotlin repository-pattern android-livedata


【解决方案1】:

但是我从未在控制台中看到 System.out。我错过了什么 因为数据库显然是充满了数据?

Observer吗? LiveData 仅在至少有一个 Observer 时才开始工作。

【讨论】:

    【解决方案2】:

    问题解决了。我从未注册过 Livedata 的观察者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多