一、核心结论
//标准写法(必须这样写)
val vm: LiveDataViewModel = viewModel()
//普通对象(不要这样写)
val vm = LiveDataViewModel()
绝对不能写:LiveDataViewModel () 必须写:viewModel ()
因为 viewModel() 不是简单的创建对象,它是【系统管家】 !
1. 为什么不能写 LiveDataViewModel()?
如果你写:
val vm = LiveDataViewModel()
这就是普通创建一个对象,后果:
❌ 屏幕一旋转,ViewModel 就重建
❌ 里面的数据全部丢失
❌ 生命周期不受系统管理
❌ 内存泄漏风险变大
❌ 完全违背 ViewModel 的设计目的
简单说:你写了等于白用 ViewModel,它该干的事一件都干不了。
2. 那 viewModel() 到底做了什么?
它是 Android 官方提供的高级工厂方法,内部帮你干了这些事:
- 从系统缓存里拿已存在的 ViewModel(不会重复创建)
- 跟着页面生命周期走(Activity 活着,ViewModel 就活着)
- 屏幕旋转不重建、数据不丢失
- 页面销毁时自动清空数据
- 自动防止内存泄漏
一句话: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!