В моем проекте я использую слегка измененный шаблон репозитория:
- Источник данных (например, 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
прекрасно работает в других репозиториях, и они сконструированы так же, как и выше.
Что здесь может пойти не так?