1.ViewModel的初始化

android-final-architecture.png

根据架构图,ViewModel的重要性不言而喻。

注意: ViewModel 通常不应引用视图、Lifecycle 或可能存储对 activity 上下文的引用的任何类。由于 ViewModel 的生命周期大于界面的生命周期,因此在 ViewModel 中保留与生命周期相关的 API 可能会导致内存泄漏。


1.1 利用ViewModelFactory初始化

val viewModel =
            ViewModelProvider.AndroidViewModelFactory.getInstance(this)
                .create(EolViewModel::class.java)

1.2 利用ViewModelProvider初始化

val viewModel = ViewModelProvider(this).get(EolViewModel::class.java)

1.3 利用系统提供KTX工具来初始化

这里需要注意一下:

fragment-ktx 和activity-ktx的版本居然不一致

当需要使用 AndroidKTX扩展程序时,最好去 官方 - KTX 扩展程序列表 查询一下。

 /** Use the 'by viewModels()' Kotlin property delegate
   *    from the activity-ktx artifact
 */
val viewModel: EolViewModel by viewModels()

2. 借助于Hilt 注入 ViewModel

使用Android中的依赖注入(DI)注入ViewModel和普通对象相比,比较特殊,所以这里重点介绍一下:

  1. 使用 @HiltViewModel 注释 具体的ViewModel类
  2. 给构造函数加上 @Inject
  3. 注入的地方不能用@Inject,而是和常规使用ViewModel一样,使用上面的3种方式之一去初始化ViewModel。

注意这里不能使用@Inject去注入ViewModel,否则获取到的ViewModel只是一个普通对象,它在Activity销毁的时候也会被回收,而无法做到如ViewModel那样的在配置改变的时候依旧保存下来。


关于更多关于ViewModel的内容,请访问