如何在用户离开屏幕时销毁ViewModel



在我的项目中,我有一个启动屏幕,当它显示时,我的应用程序从服务器加载一些启动数据,加载数据后显示另一个屏幕。对于启动屏幕,我创建了一个ViewModel,但它一直保存在内存中。如何正确销毁?

谢谢你的帮助!

@HiltViewModel
class SplashViewModel @Inject constructor (private val repository: Repository) {
....
}
@Composable
fun SplashScreen(vm: SplashViewModel) {
...
}
@Composable
fun Navigate() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "splash") {
composable("splash") {
SplashScreen(vm = hiltViewModel())
}
composable("main") {
MainScreen(...) // When shows MainScreen, SplashViewModel object still is in memory 
}
}
}

您的视图模型保留在内存中,因为启动屏幕是您的根目的地,因此它始终作为底部条目保留在堆栈中。

如果你想在离开启动屏幕时自动销毁启动视图模型,那么当你导航到主屏幕时,应该使用popUpTo从后台弹出它。

你可以考虑的另一个选项是将主屏幕设为根目的地,然后在新启动应用程序时从该屏幕导航到splash。

使用hiltViewModel并将视图模型范围界定为导航图目的地,将确保在用户离开屏幕时视图模型被破坏,前提是它不在后台。

据我所知,它在Android中没有明确支持。但是,您可以在视图模型本身内部创建一个名为onViewModelCleared()的方法,并将null传递给所有可为null的对象,并将一些轻量级的东西传递给非null对象。

最新更新