如何在用户离开屏幕时销毁 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 在用户离开该屏幕时被销毁,前提是它不在后台堆栈中。