首页 > 解决方案 > 观察另一个 ViewModel 的 ViewModel

问题描述

我有一个返回这个的 DAO:

 @Query(value = "SELECT * FROM users")
 fun getUsers(): LiveData<List<User>>

我需要观察这一点并将User对象转换为People对象。People没有实现或扩展User,但我有一个可以转换它们的方法。这是我无法改变的要求。

 fun convert(user: User): Person {...}

这就是我试图观察数据的方式。

class UserViewModel : ViewModel {
    private lateinit var people: MutableLive<List<People>>

    init {
        db.getUsers().observe(this, Observer { userList ->
            if(userList != null)
               // here I need to do some sort of transformation.
        }
    }

    // what activity will observer
    fun getPeople() : MutableLive<List<People>> {
       return people
    }
}

因此,如果Activity能够观察到people: MutableLive<List<People>>并且不知道这种转变正在发生,我会很高兴。

请帮忙。

标签: androidkotlinandroid-livedata

解决方案


这就是这样Transformations.map做的,在您的示例中,您可以使用它来执行以下操作:

class UserViewModel : ViewModel() {
    private lateinit var people: LiveData<List<Person>>

    init {
        people = Transformations.map(db.getUsers()) { users ->
            users.map { user -> convert(user) }
        }
    }
}

这为您提供了一个LiveData源自原始数据的源,但将给定的映射函数应用于它发出的数据,并且生命周期意识也得到了正确维护。


推荐阅读