Наблюдайте liveata в viewmodel для обновления пользовательского интерфейса через привязку свойства - PullRequest
1 голос
/ 06 апреля 2019

Я бы хотел наблюдать свойство currentUser: LiveData<User> (выставленное UserRepository) в ProfileViewModel для обновления свойства user: User. Это свойство связано с пользовательским интерфейсом через привязку данных и должно обновлять пользовательский интерфейс в случае изменения. Это мое предположение.

Я попытался установить свойство user с помощью Преобразований, но оно не сработало.

Какой-то код? DatabaseService.kt

    fun getById(documentId: String): MutableLiveData<T> {
        val resultObj = MutableLiveData<T>()
        db.collection(className)
            .document(documentId)
            .get()
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    val obj = task.result?.toObject(modelClass)
                    resultObj.value = obj
                } else {
                    Log.d(TAG, task.exception?.localizedMessage)
                }
            }
        return resultObj;
    }

UserRepository.kt

   fun getCurrentUser(): LiveData<User> {
        return this.getById(FirebaseAuthService.userUid)
    }

ProfileViewModel.kt

    // This doesn't work.
    val userRep = UserRepository();
    var user: User = User()

    init {
        Transformations.map(userRep.getCurrentUser()) { firebaseUser ->
            user = firebaseUser;
        }
    }

Свойство user: User привязано к пользовательскому интерфейсу. Как я могу обновить это свойство со значением объекта aliveata. Я не хочу наблюдать userRep.getCurrentUser() во фрагменте и хранить ссылку на компонент пользовательского интерфейса и обновлять в случае изменения.

1 Ответ

0 голосов
/ 06 апреля 2019

Представление не будет обновляться при изменении свойства user, поскольку оно не будет знать, что оно изменилось. Попробуйте использовать MutableLiveData<User>:

ProfileViewModel.kt

val userRep = UserRepository();
val user = MutableLiveData<User>(User())

init {
    Transformations.map(userRep.getCurrentUser()) { firebaseUser ->
        user.postValue(firebaseUser);
    }
}

При этом представление обновится, потому что LiveData, используемый в свойстве user, уведомит об изменениях в нем.

...