Jetpack ViewModel

发布于:2025-02-11 ⋅ 阅读:(41) ⋅ 点赞:(0)
private val deviceViewModel: IDeviceViewModel by viewModels<DeviceViewModel>()

这句代码是 Jetpack ViewModelFragment 或 Activity 中的标准用法,它的作用是 创建并获取 ViewModel 实例,同时确保 ViewModel 的生命周期与 UI 组件保持一致。

  • private val deviceViewModel:定义一个 私有的、不可变的 变量 deviceViewModel,用于引用 ViewModel 实例。
  • IDeviceViewModel:表示 deviceViewModel接口类型,意味着 DeviceViewModel 可能实现了 IDeviceViewModel 接口,使用接口可以实现更好的依赖注入和抽象化设计。
  • by viewModels<DeviceViewModel>()
    • viewModels<T>()Jetpack ViewModel 库提供的委托,用于 懒加载(Lazy Initialization)ViewModel。
    • 这个 viewModels<DeviceViewModel>() 会自动创建 DeviceViewModel 的实例,并在 FragmentActivity 重新创建时(如屏幕旋转)保持 ViewModel 不变

适用场景:

  • 适用于 FragmentActivity 中获取 ViewModel 实例,而 不需要手动管理 ViewModel 的创建和生命周期

等效代码(不使用 by viewModels

如果不用 by viewModels,可以这样写:

private val deviceViewModel: DeviceViewModel by lazy {
    ViewModelProvider(this).get(DeviceViewModel::class.java)
}

viewModels<T>() 方式更加简洁、安全,推荐在 FragmentActivity 中使用。

如果是在 Fragment 中,并且 ViewModel 需要 跨 Fragment 共享,可以使用 activityViewModels<T>()

private val sharedViewModel: DeviceViewModel by activityViewModels()

这样 ViewModel 就会与 Activity 共享,使多个 Fragment 访问相同的 ViewModel 数据。


网站公告

今日签到

点亮在社区的每一天
去签到