ViewModel, которая наблюдает другую ViewModel - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть 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>> и не знал, что этотрансформация происходит.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 21 февраля 2019

Это то, что делает 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, который получен изоригинал, но применяет данную функцию сопоставления к данным, которые он генерирует, плюс также поддерживается правильное понимание жизненного цикла.

...