Приложение Compose отраслевого уровня, навигация и строительные лесаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Приложение Compose отраслевого уровня, навигация и строительные леса

Сообщение Anonymous »

Я пытаюсь создать сложное приложение, имеющее несколько различных навигационных графиков, экранов и т. д. Я застрял при реализации процесса входа в систему.
Я действительно не понимаю, какой из них является наиболее совершенным способом реализации Scaffold, сохраняя при этом только один NavHost и не вызывая слишком большого количества перекомпоновок и слишком сложной логики пользовательского интерфейса.
Это похоже на поток из трех разных навигационных графов, который мы говорить о:
График входа -> График первого входа (после успешной аутентификации, но пользователю необходимо предоставить некоторые дополнительные данные при первом входе в систему) -> Главный экран.

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

            Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
) {
if (!state.isLoading) {
NavHost(
navController = navController,
startDestination = LoginNavigationGraph
) {
loginNavigationGraph(
navHostController = navController,
)

firstLoginOwnerNavGraph(
navHostController = navController,
)

mainScreenOwnerNavGraph(
navHostController = navController,
)
}
}
В каждом компоновочном объекте я использовал Scaffold, поэтому каждый экран имел Scaffold в корне, вот так:

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

@Composable
private fun FirstLoginOwnerFirstScreen(
isContinueButtonAvailable: Boolean,
lodgingPropertyList: ImmutableList
,
selectedPropertyList: ImmutableList,
isLoading: Boolean,
onContinueButtonClicked: () -> Unit,
onAction: (FirstLoginOwnerFirstScreenAction) -> Unit,
) {
Scaffold(
topBar = {
MyAppHeader(
showBackButton = false
)
}
) { paddingValues -> .... }
и он используется аналогом с именем composable с конечным именем «Root», поэтому я могу использовать составной объект без postif для предварительного просмотра

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

@Composable
fun FirstLoginOwnerFirstScreenRoot(
viewModel: FirstLoginOwnerFirstScreenViewModel = hiltViewModel(),
firstLoginOwnerFlowViewModel: FirstLoginOwnerFlowViewModel,
onNextScreenPressed: (ImmutableList
) -> Unit,
) { .....
И я добавляю их в каждый навигационный график следующим образом:

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

fun NavGraphBuilder.firstLoginOwnerNavGraph(
navHostController: NavHostController,
) {
navigation(
startDestination = OwnerGraph.FirstLogin.FirstLoginScreen1
) {
composable { navBackStackEntry ->
val registrationFlowViewModel =
navBackStackEntry.sharedViewModel(navController = navHostController)

FirstLoginOwnerFirstScreenRoot(
firstLoginOwnerFlowViewModel = registrationFlowViewModel,
onNextScreenPressed = { propertyTags ->
navHostController.navigate(
OwnerGraph.FirstLogin.FirstLoginScreen2(
list = propertyTags.toPropertyTagNavigation()
)
)
}
)
}
И я дошел до того, что после завершения первого входа в систему я перевожу пользователя на первый главный экран, и на этот раз у меня начались сомнения по поводу того, как я с этим справился до сих пор, потому что теперь мне понадобится нижняя панель навигации и более широкое использование верхней панели приложений.
Сначала я думаю добавить сюда Scaffold и второй NavHost, чтобы я мог управлять нижней навигацией в одном месте.

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

fun NavGraphBuilder.mainScreenOwnerNavGraph(
navHostController: NavHostController,
) {
navigation(
startDestination = OwnerGraph.MainScreen.MainScreenFirstScreen()
) {
composable { navBackStackEntry ->
Scaffold() {
NavHost(...
}
}
}
Но я читал из нескольких источников, что это не очень хорошая идея.
Поэтому я начал думать о том, как «поднять» один корневой каркас. вверх по иерархии, которую я мог использовать, и начал удалять каркас из каждого составного объекта в NavGraph

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

            Scaffold(
topBar = {
???
}
) {
if (!state.isLoading) {
NavHost(
navController = navController,
startDestination = LoginNavigationGraph,
modifier = Modifier
.padding(it)
) {
loginNavigationGraph(
navHostController = navController,
)

firstLoginOwnerNavGraph(
navHostController = navController,
)

mainScreenOwnerNavGraph(
navHostController = navController,
)
}

}
}
Но теперь я начал задаваться вопросом, как мне установить TopAppBar, например, когда пользователь переходит к FirstLoginOwnerFirstScreenRoot? Как мне контролировать его видимость или содержание? Что делать, если в зависимости от экрана требуется другая верхняя панель приложений? Как настроить функцию кнопки навигации. Конечно, в 99% это просто navcontroller.popBackStack(), но что, если я захочу сделать что-то еще на каком-то случайном экране в дальнейшем?
Так у меня возникла идея создания класса данных ScaffoldElement, где я бы сохранил их в hashMap, чтобы в соответствии с текущим пунктом назначения навигации я мог получить его из следующего списка:

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

data class MyAppScaffoldElement(
val topAppBar: @Composable (NavController) -> Unit = {
MyAppHeader()
},
)

val myAppList = hashMapOf(
LoginNavigationGraph.LoginMainScreen::class.qualifiedName to MyAppScaffoldElement()
)
и в главном месте:

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

    setContent {
val navController = rememberNavController()
val backStackEntry = navController.currentBackStackEntryAsState()

val myAppScaffoldItemTopBar = remember(backStackEntry.value) {
backStackEntry.value?.destination?.route?.let { myAppList[it] }?.topAppBar
}

MyAppTheme {
Surface {
Scaffold(
topBar = {
myAppScaffoldItemTopBar?.invoke(navController)
}
) { ...
Но мне кажется, что это ужасная идея в целом.
Возможно, верхняя панель приложения сейчас обрабатывается, но подумываю об обработке нижней панели навигации. похоже, это действительно плохая идея.
Итак, я начал думать об использовании CompositionLocals, чтобы сохранить список и изменить его значение

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

    val MyAppScaffold = compositionLocalOf { null }
.....

val name = remember { mutableStateOf("") }

MyAppTheme {

Scaffold(
topBar = {
CompositionLocalProvider(MyAppScaffold provides name.value) {

}
}
)
Но это также кажется ужасной идеей.
Поэтому мой вопрос: как мне обрабатывать или создавать масштабируемое приложение для создания сообщений?
p>
Я пробовал просмотреть nowInAndroid и другие примеры приложений, но это не помогло.
Или мне следует просто продолжать добавлять Scaffold на каждый экран?
Или мне следует просто продолжать добавлять Scaffold на каждый экран?
p>
Чего я боюсь, так это объединения с нижней навигацией таким образом после каждой перекомпиляции это будет выглядеть неаккуратно.
Или мне просто добавить второй NavHost?

Подробнее здесь: https://stackoverflow.com/questions/792 ... d-scaffold
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Приложение Compose отраслевого уровня, навигация и строительные леса
    Anonymous » » в форуме Android
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Java Gradle не смогла запустить строительные действия, используя соединение с распределением Gradle
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Строительные контуры из очков OpenCV
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Строительные контуры из очков OpenCV
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Строительные контуры из очков OpenCV
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

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