【问题标题】:What's wrong with using setter injection for an Android ViewModel vs Implementing and injecting a ViewModel.Factory?对 Android ViewModel 使用 setter 注入与实现和注入 ViewModel.Factory 有什么问题?
【发布时间】:2017-11-23 06:38:25
【问题描述】:

我一直在努力将 Dagger 单例注入到 android 组件(服务)和 ViewModel 中。

请参阅此question 作为参考。 我还没有找到一个很好的例子,说明如何使用 same 对象简单地在 Service 中注入字段和在 ViewModel 中注入字段。如果有一个简单的解决方案,我很乐意看到它。

我发现了一些问题,herehere,它们的答案沿着实现 ViewModel.Factory 的路径,然后通过 create 方法将依赖项注入到具有依赖项的 ViewModel 子类的构造函数中。

我的问题是。将对象注入到 Activity(和服务)中,然后在检索对象后使用 setter 将对象注入到 ViewModel 中是否存在任何严重问题?例如。

 class MainActivity : AppCompatActivity() {

    @Inject lateinit var messageBus: MessageBus // "thing" I want in the ViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        // get the ViewModel
        val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) 
        // inject the "thing" via a setter 
        viewModel.messageBus = messageBus 
    }
}

在视图MainViewModel 类中,我可以检查该值是否已设置,并且仅在它为空时设置它。

class MainViewModel: ViewModel() {

    var messageBus: MessageBus? = null
    set(value) {
        if (field == null) {
            field = value
            // do initialization stuff
        }
    }
} 

【问题讨论】:

    标签: android dependency-injection kotlin dagger-2


    【解决方案1】:

    我认为这是一种小技巧,但不是有害的技巧。我喜欢使用 dagger 提供 ViewModelFactory 以及它运行所需的所有依赖项的想法,然后将其注入到活动中,以便您可以将其传递给 of(FragmentActivity activity, ViewModelProvider.Factory factory) 方法。它避免了该属性的可变性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多