使用setter注入Android ViewModel与实现和注入ViewModel.Factory有什么不对?

时间:2017-11-23 06:38:25

标签: android dependency-injection kotlin dagger-2

我一直在努力将Dagger单例注入Android组件(Service)和ViewModel。

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

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

我的问题是。将对象注入Activity(和Service),然后使用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
        }
    }
} 

1 个答案:

答案 0 :(得分:0)

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