Мне нужна помощь относительно асинхронности между навигацией по созданию и обновлением ViewModel.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Мне нужна помощь относительно асинхронности между навигацией по созданию и обновлением ViewModel.

Сообщение Anonymous »

Я новичок в Android Kotlin, и у меня возникла небольшая проблема с входом в систему. Когда я нажимаю кнопку входа в систему, меня сразу же перенаправляют на главный экран, но до того, как ViewModel можно будет обновить, поэтому я перенаправляюсь обратно на экран входа в систему, в результате чего мне нужно дважды нажать кнопку входа, чтобы войти в систему.

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

//Login Screen
@Composable
fun LogInScreen(
onNavigateToHomeGraph: () -> Unit
) {
val loginViewModel = koinViewModel()

Column(
modifier = Modifier.fillMaxSize()
) {
Button(
onClick = {
successLogin(loginViewModel)
returnToHome(onNavigateToHomeGraph)
},
modifier = Modifier
.width(LocalConfiguration.current.screenWidthDp.dp / 2)
.align(Alignment.End)
) {
Text(
"Accedi"
)
}
}
}

private fun successLogin(loggedInViewModel: HasLoggedInViewModel) {
loggedInViewModel.changeLoginState(Login.Logged)
}

private fun returnToHome(onNavigateToHomeGraph: () -> Unit) {
onNavigateToHomeGraph()
}

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

//Login.kt
enum class Login { Logged, NotLogged }

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

//HasLoggedInViewModel
data class LogState(val state: Login)

class HasLoggedInViewModel(
private val repository: LogInStateRepository
) : ViewModel() {

val statelogin = repository.state.map { LogState(it) }.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(),
initialValue = LogState(Login.NotLogged)
)

fun changeLoginState(state: Login) = viewModelScope.launch {
repository.setLogin(state)
}
}

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

//Repository
class LogInStateRepository(private val dataStoreLogin: DataStore
) {
companion object {
private val LOG_KEY = stringPreferencesKey("login")
}

val state = dataStoreLogin.data
.map { preferences ->
try {
Login.valueOf(preferences[LOG_KEY] ?: "NotLogged")
} catch (_: Exception) {
Login.NotLogged
}
}

suspend fun setLogin(state: Login) =
dataStoreLogin.edit { it[LOG_KEY] = state.toString() }
}
По сути, я пытаюсь заставить навигацию на главном экране ждать обновления модели представления. Я пробовал использовать async/await и приостановить работу с сопрограммами, но приостановка, похоже, не работала, поскольку она считается излишним в функциях SuccessLogin() или returnToHome(), кроме того, это может привести к сбою моего приложения, но это может быть неправильной реализацией с моей стороны.


Подробнее здесь: https://stackoverflow.com/questions/787 ... -and-a-vie
Ответить

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

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

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

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

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