Код: Выделить всё
//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() }
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... -and-a-vie
Мобильная версия