Исходная подписка Android MediatorLiveData не запускается - PullRequest
0 голосов
/ 21 июня 2019

В моем проекте я использую слегка измененный шаблон репозитория:

  • Источник данных (например, API, база данных). Предоставляет CRUD субъектов
  • Хранилище конкретных данных (например, UserRepository, SettingsRepository), которое обрабатывает сверку источников данных (например, обновление базы данных из вызова API). Обеспечивает базовую функциональность выше CRUD
  • ViewModel, которая использует репозитории и создает поток вызовов репозиториев (например, используйте UserRepository для синхронизации пользовательских данных, затем SettingsRepository для синхронизации настроек для пользователя)
  • Вид привязан к данным

В своих репозиториях я использую открытые поля LiveData <*> для сообщения о состоянии - например, указанный UserRepository будет иметь поле currentUser открытого типа LiveData, в частном порядке MediatorLiveData, и оно будет связано с закрытым полем, в котором хранится текущий идентификатор пользователя, который нужно получить.

Однако эти подписки (с использованием метода addSource() {} MediatorLiveData) по какой-то причине не запускаются.

Пример почти 1: 1 (заменено название модели из-за NDA) будет следующим:

abstract class BaseRepository: ViewModel(), KoinComponent {

    val isLoading: LiveData<Boolean> = MutableLiveData<Boolean>().apply { postValue(false) }

}


class UserRepository: BaseRepository() {

    private val client: IClient by inject() // Koin injection of API client
    private val sharedPref: SharedPrefManager by inject() // custom wrapper around SharedPreferences

    private val currentUserId = MutableLiveData()

    val currentUser: LiveData<User> = MediatorLiveData()
    val users: LiveData<List<User>> = MutableLiveData()

    init {
        (currentUser as MediatorLiveData).addSource(currentUserId) { updateCurrentUser() }
        (currentUser as MediatorLiveData).addSource(users) { updateCurrentUser() }

        (currentUserId as MutableLiveData).postValue(sharedPref.getCurrentUserId())
        // sharedPref.getCurrentUserId() will return UUID? - null if 
    }

    fun updateCurrentUser() {
        // Here I have the logic deciding which user to push into `currentUser` based on the list of users, and if there's a `currentUserId` present.
    }
}

В этом примере реализации updateCurrentUser() никогда не вызывается, даже если подписка на другие поля LiveData происходит и отображается при отладке на объекте currentUser.

Та же подписка через addSource прекрасно работает в других репозиториях, и они сконструированы так же, как и выше.

Что здесь может пойти не так?

1 Ответ

2 голосов
/ 21 июня 2019

MediatorLiveData не будет наблюдать источник LiveData, если на него не будет подписан какой-либо наблюдатель. updateCurrentUser() будет вызван, как только вы подпишитесь на currentUser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...