我一直在努力将Dagger单例注入Android组件(Service)和ViewModel。
请参阅此question作为参考。 我还没有找到一个很好的例子,说明如何使用相同的对象简单地在服务和ViewModel中的字段中注入字段。如果有一个简单的解决方案,我很乐意看到它。
我发现了一些问题here和here,这些问题的答案沿着实现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
}
}
}
答案 0 :(得分:0)
我认为这是一个小黑客,但不是一个有害的黑客。我喜欢使用匕首ViewModelFactory
以及它运行所需的所有依赖项,然后将其注入活动中以便将其传递给of(FragmentActivity activity, ViewModelProvider.Factory factory)
方法。它避免了对该属性的可变性。