Как инициализировать несколько параметров в компоновке реактивного ранца. Верный путь?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как инициализировать несколько параметров в компоновке реактивного ранца. Верный путь?

Сообщение Anonymous »

Если у меня есть несколько параметров, которые я получаю из репозитория, который получает их из хранилища данных, как мне их правильно инициализировать -
Это мой текущий подход -`
@HiltViewModel
class UserDataViewModel @Inject конструктор(private val userDataRepository: UserDataRepository) :
ViewModel() {

Код: Выделить всё

private val _userIdFlow = MutableStateFlow(AppDefaults.DEFAULT_USER_ID)

val userIdFlow: StateFlow = _userIdFlow.asStateFlow()

private val _userNameFlow = MutableStateFlow(AppDefaults.DEFAULT_USER_NAME)

val userNameFlow: StateFlow = _userNameFlow.asStateFlow()

private val _userEmailFlow = MutableStateFlow(AppDefaults.DEFAULT_USER_EMAIL)

val userEmailFlow: StateFlow = _userEmailFlow.asStateFlow()

private val _isPremiumUserFlow = MutableStateFlow(AppDefaults.DEFAULT_IS_PREMIUM_USER)

val isPremiumUserFlow: StateFlow = _isPremiumUserFlow.asStateFlow()

private val _isFirstTimeUserFlow =
MutableStateFlow(AppDefaults.DEFAULT_IS_FIRST_TIME_USER)

val isFirstTimeUserFlow: StateFlow = _isFirstTimeUserFlow.asStateFlow()

private val _isLoggedInFlow = MutableStateFlow(AppDefaults.DEFAULT_IS_LOGGED_IN)

val isLoggedInFlow: StateFlow  = _isLoggedInFlow.asStateFlow()

val isDataLoaded = MutableStateFlow(false)

init {
loadAllData()
}

private fun loadAllData() {
viewModelScope.launch {
// Launch all load operations in parallel using async
val userIdJob = async { loadUserId() }
val userNameJob = async { loadUserName() }
val userEmailJob = async { loadUserEmail() }
val isPremiumUserJob = async { loadIsPremiumUser() }
val isFirstTimeUserJob = async { loadIsFirstTimeUser() }
val isLoggedInJob = async { loadIsLoggedIn() }

try {
Log.d("Init", "Start loading data")
// Await all jobs to complete
awaitAll(userIdJob, userNameJob, userEmailJob, isPremiumUserJob, isFirstTimeUserJob, isLoggedInJob)
Log.d("Init", "Data Loaded")
} catch (e: Exception) {
// Handle any errors
Log.e("UserDataViewModel", "Error loading data", e)
} finally {
withContext(Dispatchers.Main) {
isDataLoaded.value = true
}
}
}
}

private suspend fun loadUserId() {
userDataRepository.userIdFlow
.catch { Log.e("UserDataViewModel", "Error loading userId", it) }
.collect { _userIdFlow.value = it ?: AppDefaults.DEFAULT_USER_ID }
}

private suspend fun loadUserName() {
userDataRepository.userNameFlow
.catch { Log.e("UserDataViewModel", "Error loading userName", it) }
.collect { _userNameFlow.value = it ?: AppDefaults.DEFAULT_USER_NAME }
}

private suspend fun loadUserEmail() {
userDataRepository.userEmailFlow
.catch { Log.e("UserDataViewModel", "Error loading userEmail", it) }
.collect { _userEmailFlow.value = it ?: AppDefaults.DEFAULT_USER_EMAIL }
}

private suspend fun loadIsPremiumUser() {
userDataRepository.isPremiumUserFlow
.catch { Log.e("UserDataViewModel", "Error loading isPremiumUser", it) }
.collect { _isPremiumUserFlow.value = it ?: AppDefaults.DEFAULT_IS_PREMIUM_USER }
}

private suspend fun loadIsFirstTimeUser() {
userDataRepository.isFirstTimeUserFlow
.catch { Log.e("UserDataViewModel", "Error loading isFirstTimeUser", it) }
.collect { _isFirstTimeUserFlow.value = it ?: AppDefaults.DEFAULT_IS_FIRST_TIME_USER
}
}

private suspend fun loadIsLoggedIn() {
userDataRepository.isLoggedInFlow
.catch { Log.e("UserDataViewModel", "Error loading isLoggedIn", it) }
.collect { _isLoggedInFlow.value = it ?: AppDefaults.DEFAULT_IS_LOGGED_IN
}
}

fun setUserId(userId: String) {
viewModelScope.launch {
userDataRepository.setUserId(userId)
}

}

fun setUserName(userName: String) {
viewModelScope.launch {
userDataRepository.setUserName(userName)
}

}

fun setUserEmail(userEmail: String) {
viewModelScope.launch {
userDataRepository.setUserEmail(userEmail)
}

}

fun setIsPremiumUser(isPremiumUser: Boolean) {
viewModelScope.launch {
userDataRepository.setIsPremiumUser(isPremiumUser)
}
}

fun setIsFirstTimeUser(isFirstTimeUser: Boolean) {
viewModelScope.launch {
userDataRepository.setIsFirstTimeUser(isFirstTimeUser)
Log.d("ViewModel", "setIsFirstTimeUser: $isFirstTimeUser")
}
}

fun setIsLoggedIn(isLoggedIn: Boolean) {
viewModelScope.launch {
userDataRepository.setIsLoggedIn(isLoggedIn)
}
}
}`
Просто посмотрите в блоке инициализации, я предоставил весь код для справки.
Я ожидаю установить isDataLoaded только после завершения всей области действия

Подробнее здесь: https://stackoverflow.com/questions/791 ... -right-way
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»