解析:val vm: LiveDataViewModel = viewModel()

7 阅读2分钟

一、核心结论

//标准写法(必须这样写)
val vm: LiveDataViewModel = viewModel()
//普通对象(不要这样写)
val vm = LiveDataViewModel()

绝对不能写:LiveDataViewModel () 必须写:viewModel ()

因为 viewModel() 不是简单的创建对象,它是【系统管家】

1. 为什么不能写 LiveDataViewModel()

如果你写:

val vm = LiveDataViewModel()

这就是普通创建一个对象,后果:

❌ 屏幕一旋转,ViewModel 就重建

❌ 里面的数据全部丢失

❌ 生命周期不受系统管理

❌ 内存泄漏风险变大

❌ 完全违背 ViewModel 的设计目的

简单说:你写了等于白用 ViewModel,它该干的事一件都干不了。

2. 那 viewModel() 到底做了什么?

它是 Android 官方提供的高级工厂方法,内部帮你干了这些事:

  1. 从系统缓存里拿已存在的 ViewModel(不会重复创建)
  2. 跟着页面生命周期走(Activity 活着,ViewModel 就活着)
  3. 屏幕旋转不重建、数据不丢失
  4. 页面销毁时自动清空数据
  5. 自动防止内存泄漏

一句话:viewModel() = 让 ViewModel 真正生效的魔法函数

3. 最直观对比(一看就懂)

写法效果能不能用?
val vm = LiveDataViewModel()普通对象,旋转丢数据,生命周期不受控❌ 错误
val vm: LiveDataViewModel = viewModel()系统管理,旋转不丢数据,生命周期安全✅ 正确

4. 超通俗比喻

  • LiveDataViewModel()  = 你自己随便买个手机,摔坏了就没了
  • viewModel()  = 官方给你配的专用安全手机,掉水里都能给你救回来,数据永远不丢

ViewModel 之所以能做到:旋转屏幕不丢失数据****页面退出自动清理

全靠 viewModel () 这个函数!

5. 最标准正确写法(Compose 里)

val vm: LiveDataViewModel = viewModel()

val vm = viewModel<LiveDataViewModel>()

两种都对,效果一样。

终极总结(记住这句就够)

  • ViewModel 不能自己直接实例化!
  • 必须通过系统提供的 viewModel () 函数获取!
  • 否则等于白用 ViewModel!