(Jetpackcompose) Метод onCreate выполняется несколько раз

#android #android-jetpack-compose #android-architecture-navigation

Вопрос:

Я использую Navigation Components в jetpack compose. Когда я перехожу к другому, onCreate запускался 5,6 раза.

Это мой журнал приложений, когда я запускаю приложение и перехожу на другие маршруты ->

 2021-09-25 16:40:41.486 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.486 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.486 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.486 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.486 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.486 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.487 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.487 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.488 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.488 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.509 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_CREATE
2021-09-25 16:40:41.510 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.511 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.637 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_CREATE
2021-09-25 16:40:41.638 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.638 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.926 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_CREATE
2021-09-25 16:40:41.926 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.928 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
2021-09-25 16:40:41.944 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_CREATE
2021-09-25 16:40:41.944 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_START
2021-09-25 16:40:41.947 28201-28201/ir.amirsobhan.larzenegar D/HomeScreenKt$HomeScreen: ON_RESUME
 

Это раздел приложения, в котором я настраивал компоненты навигации ->

    AppTheme{
        val appStateHolder = rememberAppStateHolder()
        Scaffold(
            bottomBar ={
                if (appStateHolder.shouldShowBottomBar){
                    BottomNav(
                        navigateToRoute = appStateHolder::navigateToBottomBarRoute
                    )
                }
            },
            scaffoldState = appStateHolder.scaffoldState
        ) {
            NavHost(
                navController = appStateHolder.navController,
                startDestination = Constants.Navigation.HOME_SCREEN
            ) {
                composable(Constants.Navigation.HOME_SCREEN) { HomeScreen(viewModel = hiltViewModel()) }
                composable(Constants.Navigation.MAP_SCREEN) { MapScreen(viewModel = hiltViewModel()) }
                composable(Constants.Navigation.LOCATION_SCREEN) {  }
                composable(Constants.Navigation.CHART_SCREEN) {  }
                composable(Constants.Navigation.SEARCH_SCREEN) {  }
            }
        }
   }
 

Рабочий стол ->

 fun HomeScreen(viewModel: HomeViewModel) {
    LocalLifecycleOwner.current.lifecycle.addObserver(object : LifecycleEventObserver {
        override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
            Timber.d(event.name)
        }
}
 

Комментарии:

1. Я думаю, что вы прикрепляете несколько наблюдателей к каждой композиции, добавляете увеличивающийся идентификатор для каждого наблюдателя и печатаете его для подтверждения

2. Да, вы правы. После того, как я добавлю в него своего наблюдателя, DisposableEffect он покажет только истинный журнал. Большое спасибо

3. С удовольствием. Держите этот вопрос в курсе, если проблема не устранится 🙂