Совместное использование пользовательского интерфейса в навигации Jetpack ComposeAndroid

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

Сообщение Anonymous »

Я создаю простой проект, чтобы узнать больше о KMP и Compose в целом. В моем проекте у меня есть 2 основных раздела: «Аутентифицированный» и «Неаутентифицированный» (страница входа). Мой текущий подход выглядит примерно так:

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

@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 { ... }
}
}
}
И, наконец, экран входа в систему имеет собственную ViewModel для отслеживания вводимого текста, вызова API входа в систему, отображения счетчика загрузки и т. д.:

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

@Composable
fun LoginScreen(viewModel: LoginViewModel = viewModel { LoginViewModel() }) { ... }
Обратите внимание, что проект настроен для поддержки браузерной навигации в веб-приложениях. Я не добавлял это в приведенный выше код, просто для простоты.
Весь мой подход работает. Однако я заметил некоторые проблемы:
  • Во-первых, у меня утечка LoginViewModel. Я понял, что его жизненный цикл связан с жизненным циклом Activity, поэтому мы будем поддерживать его активность, пока приложение работает. Вероятно, это не имеет большого значения в данном конкретном случае, но, опять же, цель этого проекта — изучение лучших практик и т. д.
  • Во-вторых, я заметил, что этот подход приводит к несогласованному поведению между Android и веб-версиями. В Android после выхода из системы или входа в систему всегда возвращается HomeRoute. В Интернете он возвращается к последней странице, которую мы посетили. Это имеет смысл, поскольку URL-адрес браузера не меняется, когда мы направляем пользователя на экран входа в систему.
Итак... Как правильно это сделать? Я пробовал использовать подграфы для навигации, но они не позволяют определить общий пользовательский интерфейс для всего подграфа. В идеале я хотел бы избежать использования оболочки для добавления заголовка на каждый экран аутентификации. Есть рекомендации?

Подробнее здесь: https://stackoverflow.com/questions/798 ... navigation
Ответить

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

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

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

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

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