如何在用户离开屏幕时销毁 ViewModel
How to destroy a ViewModel when user leave a screen
在我的项目中,我有一个初始屏幕,当它显示时,我的应用程序从服务器加载一些启动数据,加载数据后显示另一个屏幕。
对于初始屏幕,我创建了一个 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
}
}
}
据我所知,Android 并未明确支持它。但是,您可以在视图模型本身内部创建一个名为 onViewModelCleared()
的方法,并将 null 传递给所有可为 null 的对象,并将一些轻量级的东西传递给非 null 对象。
您的视图模型保留在内存中,因为启动画面是您的根目的地,因此它始终作为底部条目保留在堆栈中。
如果您希望在您离开初始屏幕时自动销毁初始视图模型,您应该在导航到主屏幕时使用 popUpTo
.
从后台弹出它
您可以考虑的另一个选择是将您的主屏幕设置为根目的地,然后如果您是全新启动应用程序,则从该屏幕导航至启动画面。
使用 hiltViewModel
并将 viewmodel 的范围限定到导航图目的地将确保 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
}
}
}
据我所知,Android 并未明确支持它。但是,您可以在视图模型本身内部创建一个名为 onViewModelCleared()
的方法,并将 null 传递给所有可为 null 的对象,并将一些轻量级的东西传递给非 null 对象。
您的视图模型保留在内存中,因为启动画面是您的根目的地,因此它始终作为底部条目保留在堆栈中。
如果您希望在您离开初始屏幕时自动销毁初始视图模型,您应该在导航到主屏幕时使用 popUpTo
.
您可以考虑的另一个选择是将您的主屏幕设置为根目的地,然后如果您是全新启动应用程序,则从该屏幕导航至启动画面。
使用 hiltViewModel
并将 viewmodel 的范围限定到导航图目的地将确保 viewmodel 在用户离开该屏幕时被销毁,前提是它不在后台堆栈中。