Код: Выделить всё
@Composable
fun App(viewModel: AppViewModel = viewModel { AppViewModel() }) {
MaterialTheme {
val authState = viewModel.state.collectAsState() // Auth state stream
when (val authStateValue = authState.value) {
is AuthState.Authenticated -> AuthenticatedScreen(profile = authStateValue.profile)
is AuthState.Unauthenticated -> LoginScreen()
}
}
}
Код: Выделить всё
@Composable
fun AuthenticatedScreen(profile: Profile) {
Column {
Text("Welcome, ${profile.name}!") // Common Header
val navController = rememberNavController()
NavHost(navController = navController, startDestination = HomeRoute) {
composable { ... }
composable { ... }
}
}
}
Код: Выделить всё
@Composable
fun LoginScreen(viewModel: LoginViewModel = viewModel { LoginViewModel() }) { ... }
Весь мой подход работает. Однако я заметил некоторые проблемы:
- Во-первых, у меня утечка LoginViewModel. Я понял, что его жизненный цикл связан с жизненным циклом Activity, поэтому мы будем поддерживать его активность, пока приложение работает. Вероятно, это не имеет большого значения в данном конкретном случае, но, опять же, цель этого проекта — изучение лучших практик и т. д.
- Во-вторых, я заметил, что этот подход приводит к несогласованному поведению между Android и веб-версиями. В Android после выхода из системы или входа в систему всегда возвращается HomeRoute. В Интернете он возвращается к последней странице, которую мы посетили. Это имеет смысл, поскольку URL-адрес браузера не меняется, когда мы направляем пользователя на экран входа в систему.
Подробнее здесь: https://stackoverflow.com/questions/798 ... navigation
Мобильная версия