【发布时间】:2018-11-27 00:55:23
【问题描述】:
我正在编写一个(试图)遵守 MVVM 设计模式的应用程序。我想从该层的其他部分观察模型层的变化。例如
假设我正在使用 room 从我的数据库中公开一个对象列表:
@Dao
interface MyDao {
@Query("SELECT * FROM myTable")
fun getAllElements(): LiveData<List<Element>>
}
我希望能够像使用LiveData.observeForever(). 的生命周期所有者一样观察变化,例如:
class BusinessLogicPartOfTheModel(private val myDao: MyDao) {
private var allElements = listOf<Element>()
init {
myDao.getAllElements().observeForever { observedElements ->
allElements = observedElements
}
}
但是,我发现如果我在 ViewModel 和 Fragment 中注册一个像这样的观察者以及一个更标准的观察者:
class MyViewModel(private val myDao: MyDao) : ViewModel() {
fun getAllElements(): LiveData<List<Elements>> {
myDao.getAllElements()
}
}
class MyFragment : Fragment() {
private val myDao /* initialized here */
private val myViewModel /* initialized here */
private val logic = BusinessLogicPartOfTheModel(myDao)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val obs = Observer<List<Element>> {
// do a thing
}
myViewModel.getAllElements.observe(viewLifeCycleOwner, obs)
}
}
只有片段中的观察者被调用,而不是业务逻辑对象中的观察者。我可以成功地观察片段中的更新并将事件传递回业务逻辑,但这似乎是一个非常不必要的间接级别。我是否在这里遗漏了一步,或者这不太可能按照我想要的方式运行?
【问题讨论】:
-
对于现在提出这个问题的任何人:我建议改用协程
Flows。如果您需要在模型层之上,它们很容易转换为LiveData。
标签: android kotlin observable android-livedata