【问题标题】:View Model not destroyed on back press in jetpack compose在 jetpack compose 的背压上查看模型没有被破坏
【发布时间】:2022-01-07 15:15:30
【问题描述】:

我知道有很多类似的问题,我已经解决了,但我的问题仍然没有解决。

我的问题的缩小示例,
我有 2 个可组合的 ScreenAScreenB
两个可组合项都有单独的视图模型。 我从屏幕 A 开始并导航到屏幕 B。按下后退按钮时,我希望屏幕 B 视图模型被破坏。因此,当我再次导航到屏幕 B 时,我希望再次创建它的视图模型。

屏幕A

@Composable
fun ScreenA(
    screenViewModel: ScreenAViewModel = hiltViewModel(),
) { 
  // Compose code
}

屏幕B

@Composable
fun ScreenB(
    screenViewModel: ScreenBViewModel = hiltViewModel(),
) { 
  // Compose code
}

the Hilt and Jetpack Navigation Docs 开始,我的理解是使用hiltViewModel() 应该将视图模型的范围限定为特定的可组合。我不清楚那里是否有错误。

我如何验证视图模型没有被破坏?

在屏幕 B 视图模型初始化块中添加了一个断点。当我来回导航时,它只到达初始化一次。

推荐问题
How to destroy a ViewModel when user leave a screen
How to share a viewmodel between two or more Jetpack composables inside a Compose NavGraph?
Activity view model in Jetpack compose
Android Compose Navigation and ViewModel lifecycle
Different viewmodel for different composable functions inside same activity

具有最少可重现代码的示例 repo - https://github.com/Abhimanyu14/compose-navigation-sample

【问题讨论】:

  • 这能回答你的问题吗? Scoping States in Jetpack Compose
  • 我们需要minimal reproducible exampleHere's mine,按预期工作,例如每次出现屏幕并显示新的日期时间时都会调用init。如果它不适合您,您使用的是哪个 Compose/Navigation 版本?
  • @PhilipDukhov,很明显我在我的主要项目中做错了什么。我创建了一个示例 MVP 项目来在这里分享。但它按预期工作。如果我得到问题的根本原因,我将深入研究我的存储库以了解更多信息并进行更新。谢谢。 ??????

标签: android android-jetpack-compose


【解决方案1】:

问题是,我错误地使用了CompositionLocalProvider

这是我的初始代码。

@Composable
fun MyNavGraph(
    activityViewModel: MainActivityViewModel,
    viewModelStoreOwner: ViewModelStoreOwner,
) {
    val navHostController = rememberNavController()
    val myNavActions = remember(navHostController) {
        MyNavActions(navHostController)
    }

    NavHost(
        navController = navHostController,
        startDestination = Screen.Home.route,
    ) {
        composable(
            route = Screen.Home.route,
        ) { navBackStackEntry ->
            CompositionLocalProvider(
                LocalViewModelStoreOwner provides viewModelStoreOwner
            ) {
                HomeScreen(
                    activityViewModel = activityViewModel,
                    navigateToSettings = {
                        myNavActions.navigateTo(
                            navBackStackEntry,
                            Screen.Settings.route,
                        )
                    },
                )
            }
        }
        composable(
            route = Screen.Settings.route,
        ) { navBackStackEntry ->
            CompositionLocalProvider(
                LocalViewModelStoreOwner provides viewModelStoreOwner
            ) {
                SettingsScreen(
                    activityViewModel = activityViewModel,
                )
            }
        }
    }
}

删除

CompositionLocalProvider(
    LocalViewModelStoreOwner provides viewModelStoreOwner
)

将视图模型的范围固定为可组合范围。

带有初始提交和固定提交的示例 repo -
https://github.com/Abhimanyu14/compose-navigation-sample

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2017-10-30
    • 2011-09-19
    • 1970-01-01
    • 2015-05-22
    相关资源
    最近更新 更多