Что работает на данный момент:
Код: Выделить всё
class AchievementDetailsViewModel(private val achievementId: String) : ViewModel() {
private val _achievement: MediatorLiveData = MediatorLiveData()
public val achievement: LiveData get() = _achievement
init {
fetchAchievementData()
}
private fun fetchAchievementData() {
viewModelScope.launch {
val achievementLiveData = AchievementService.getAchievement(achievementId)
_achievement.addSource(achievementLiveData) {
_achievement.value = it
}
}
}
}
object AchievementService {
fun getAchievement(id: String): LiveData {
return Firebase.firestore.collection(Collections.ACHIEVMENTS).document(id)
.snapshots()
.map { s -> s.toObject(Achievement::class.java)!! }
.asLiveData()
}
}
Чтобы добавить список пользователей в ViewModel , я попытался добавить следующий код:
Код: Выделить всё
class AchievementDetailsViewModel(private val achievementId: String) : ViewModel() {
private val _achievement: MediatorLiveData = MediatorLiveData()
public val achievement: LiveData get() = _achievement
private val _owners: MediatorLiveData = MediatorLiveData(emptyList())
public val owners: LiveData get() = _owners
init {
fetchAchievementData()
fetchOwnerData()
}
private fun fetchOwnerData() {
viewModelScope.launch {
_achievement.observeForever { achievement ->
val ownersLiveData = UserService.getUsers(achievement.ownerIds)
_owners.addSource(ownersLiveData) { _owners.value = it }
}
}
}
}
object UserService {
fun getUsers(userIds: List): LiveData {
return Firebase.firestore.collection(Collections.USERS)
.whereIn(FieldPath.documentId(), userIds)
.snapshots()
.map { s -> s.toObjects(User::class.java) }
.asLiveData()
}
}
Код: Выделить всё
fun getUsers(userIds: List): LiveData {
if (userIds.isEmpty()) {
return MutableLiveData(ListOf())
}
return Firebase.firestore.collection(Collections.USERS)
.whereIn(FieldPath.documentId(), userIds)
.snapshots()
.map { s -> s.toObjects(User::class.java) }
.asLiveData()
}
Изменить: чтобы уточнить, ожидаемое поведение относится к LiveData> для обновления на основе содержимого LiveData Я понимаю, почему моя реализация не дает такого результата, но я не знаю, как добиться ожидаемого поведения. Я предполагаю, что проблема больше связана с неправильным использованием LiveData, чем с Firestore.
Подробнее здесь: https://stackoverflow.com/questions/783 ... ther-lived