Как правильно инициализировать несколько параметров в модели представления для Jetpack Compose?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как правильно инициализировать несколько параметров в модели представления для Jetpack Compose?

Сообщение Anonymous »

Если у меня есть несколько параметров, которые я получаю из репозитория, который получает их из хранилища данных. Как мне правильно их инициализировать?
Это мой текущий подход:

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

@HiltViewModel
class UserDataViewModel @Inject constructor(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)
}
}
}
Инициализация начинается в блоке init.
Я ожидаю установить isDataLoaded только после завершения блока и всех данных. загружено.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ose-the-ri
Ответить

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

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

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

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

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