Как обрабатывать 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() }
    )

}

Вы должны прочитать больше об изменении состояния в компоновке реактивного ранца.

Ссылка: https://developer.android.com/jetpack/compose/state