Я действительно не понимаю, какой из них является наиболее совершенным способом реализации 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,
)
}
}
Код: Выделить всё
@Composable
private fun FirstLoginOwnerFirstScreen(
isContinueButtonAvailable: Boolean,
lodgingPropertyList: ImmutableList
,
selectedPropertyList: ImmutableList,
isLoading: Boolean,
onContinueButtonClicked: () -> Unit,
onAction: (FirstLoginOwnerFirstScreenAction) -> Unit,
) {
Scaffold(
topBar = {
MyAppHeader(
showBackButton = false
)
}
) { paddingValues -> .... }
Код: Выделить всё
@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,
)
}
}
}
Так у меня возникла идея создания класса данных 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