Как обрабатывать BottomNavigation Scaffold в MainActivity
я написалJetpack Compose
пример для изучения. У меня есть экран входа в систему, и после входа в систему у меня есть нижняя навигация, верхняя панель. Видимость этого эшафота настраивается в закрытом классе навигации, как показано ниже.
sealed class KutuphanemNavigationItem(
val screenRoute: String,
val showBottomBar: Boolean = false,
val data: Any? = null,
@DrawableRes val icon: Int? = null,
@StringRes val title: Int? = null,
val showTopBar:Boolean = false,
@StringRes val pageTitle:Int? = null
) {
object LoginScreen : KutuphanemNavigationItem(screenRoute =
"kutuphanem_login_screen")
object MainScreen : KutuphanemNavigationItem(
screenRoute = "kutuphanem_main_screen",
icon = R.drawable.ic_baseline_home_24,
title = R.string.anasayfaItem,
showTopBar = true,
showBottomBar = true,
pageTitle = R.string.anasayfaItem
)
object BookListScreen : KutuphanemNavigationItem(
screenRoute = "kutuphanem_kitap_list_screen",
icon = R.drawable.ic_baseline_view_list_24,
showBottomBar = true,
title = R.string.listeItem
)
object ParameterScreen : KutuphanemNavigationItem(
screenRoute = "kutuphanem_parameter_screen",
icon = R.drawable.ic_baseline_settings_24,
title = R.string.parametreItem,
showTopBar = true,
showBottomBar = true,
pageTitle = R.string.parametreItem
)
object ProfileScreen : KutuphanemNavigationItem(
screenRoute = "kutuphanem_profile_screen",
icon = R.drawable.ic_baseline_person_24,
title = R.string.profilimItem,
showBottomBar = true
)
object ParameterYayinEviScreen : KutuphanemNavigationItem(
screenRoute = "kutuphanem_parameter_yayinevi_screen",
showTopBar = true,
pageTitle = R.string.yayinEviLabel
)
}
Также я устанавливаю начальный пункт назначения, а Scaffolds написаны вMainActivity
потому что приложение использует одно действие, как показано ниже
Scaffold(modifier = Modifier.navigationBarsPadding(),
scaffoldState = kutuphanemAppState.scaffoldState,
floatingActionButton = {
if (viewModel.checkTokenExist() && kutuphanemAppState.navController.isBottomNavigationTopBarVisible(
isBottomNavigation = true
)) {
KutuphanemNavigationBottomFloatingActionButton()
}
},
isFloatingActionButtonDocked = true,
floatingActionButtonPosition = FabPosition.Center,
topBar = {
if (viewModel.checkTokenExist() && kutuphanemAppState.navController.isBottomNavigationTopBarVisible()) {
val currentPage: KutuphanemNavigationItem? =
kutuphanemAppState.navController.getCurrentNavigationItem()
KutuphanemTopBar(
navController = kutuphanemAppState.navController,
pageTitle = stringResource(
id = currentPage?.pageTitle ?: R.string.anasayfaItem
)
)
}
},
bottomBar = {
if (viewModel.checkTokenExist() && kutuphanemAppState.navController.isBottomNavigationTopBarVisible(
isBottomNavigation = true
)
) {
KutuphanemBottomNavigationBar(kutuphanemAppState.navController)
}
},
snackbarHost = {
KutuphanemSnackBarHost(state = kutuphanemAppState.kutuphanemSnackbarState)
}) {
if (viewModel.checkTokenExist()) {
KutuphanemNavigation(
navController = kutuphanemAppState.navController,
startDestinition = KutuphanemNavigationItem.MainScreen,
showSnackbar = { message, duration, type ->
kutuphanemAppState.showSnackbar(
message = message,
duration = duration,
type = type
)
}
)
} else {
KutuphanemNavigation(
navController = kutuphanemAppState.navController,
startDestinition = KutuphanemNavigationItem.LoginScreen,
showSnackbar = { message, duration, type ->
kutuphanemAppState.showSnackbar(
message = message,
duration = duration,
type = type
)
}
)
}
}
Если токен не существует, переход кLoginScreen
иначе переход к . Но когда я хочу перейти кMainScreen
после успешного входа в систему нижняя навигация, верхняя панель и кнопки FAB не отображаются. Когда я снова закрываю приложение, они отображаются. В чем причина этого случая?
1 ответ
ViewModel имеет логику для проверки токена и состояние, которое будет обновляться моделью представления, а состояние будет наблюдаться компонуемым, при изменении состояния составные компоненты будут перекомпоновывать и обновлять базу пользовательского интерфейса в новом состоянии.
data class UiState(
val tokenExist: Boolean = false
)
class LoginViewModel(
private val repository: LoginRepository,
private val savedState: SavedStateHandle
) : ViewModel() {
var uiState by mutableStateOf(UiState())
private set
// Business logic
fun somethingRelatedToBusinessLogic() { /* ... */ }
}
@Composable
fun LogineScreen(viewModel: LoginViewModel = viewModel()) {
val uiState = viewModel.uiState
/* ... */
ExampleReusableComponent(
someData = uiState.tokenExist,
onDoSomething = { viewModel.somethingRelatedToBusinessLogic() }
)
}
Вы должны прочитать больше об изменении состояния в компоновке реактивного ранца.