【问题标题】:Why should I use viewmodelproviders for viewmodels?为什么我应该为视图模型使用 viewmodelproviders?
【发布时间】:2020-01-31 00:30:33
【问题描述】:

为什么我应该为视图模型使用 viewmodelproviders?

为什么我不能将自定义单例注释添加到我的视图模型,然后将此视图模型注入片段类?

像这样:

@MainScope
class MainViewModel @Inject constructor(): ViewModel()

然后:

open class BaseFragment<T: ViewModel>: DaggerFragment() {
@Inject
protected lateinit var viewModel: T

这两种情况都与屏幕旋转无关。

单例注释案例有什么缺点吗? 我只看到了优点,使用这种方法我不需要复制/粘贴大量代码。

【问题讨论】:

  • 我使用带有 Dagger 和 ViewModelProviders 的 ViewModelFactory,它运行良好。请参阅此处了解更多信息:proandroiddev.com/…
  • 我也用过,效果很好。但我不明白为什么要使用它。它至少需要 3 个复制/粘贴类。
  • Dagger 作用域和注入也很有效。据我所知 - ViewModelProviders 是帮助器类,其主要目的是创建 viewmodel 的新实例,如果它不存在,否则返回现有实例。
  • 带有作用域的 Dagger 可以做同样的事情,但不需要额外的类。

标签: android mvvm dagger-2


【解决方案1】:

为什么要为视图模型使用 viewmodelproviders?

viewModel.onCleared() 回调在正确的时间被ComponentActivity 正确调用。

(并确保它只为给定的 ViewModelStoreOwner 创建一次)。

为什么我不能将自定义单例注释添加到我的视图模型,然后将此视图模型注入片段类?

因为ComponentActivity 不会在正确的时间正确调用viewModel.onCleared() 回调。

单例注释案例有什么缺点吗?我只看到优点,

你没有得到viewModel.onCleared()

另外,如果你有一个单例变体,那么 ViewModel 不会随着它的封闭完成 Activity 而死,并且即使在返回导航时也保持活动状态(这可能不是故意的)。

使用这种方法,我不需要复制/粘贴大量代码。

您正在使用 Kotlin。使用扩展函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2018-11-20
    • 2019-12-14
    • 2015-09-28
    • 1970-01-01
    • 2020-07-15
    • 2015-03-05
    相关资源
    最近更新 更多