我最近学习了dagger2,遇到了一种情况,我必须在我的视图模型中注入一个类的变量。 几乎在所有地方,建议通过 ViewModelFactory 传递该变量并将该变量注入 ViewModel Factory 构造函数中。 但是,从技术上讲,我也可以在 viewmodel 中注入一个字段,并在 viewmodel 的 init() 函数中调用 component.init 方法。我仍然可以在我的视图模型中使用该变量,而无需创建视图模型工厂。 这个方法有什么问题吗?
例如 我的视图模型
class MainActivityViewModel() : ViewModel() {
@Inject
lateinit var repository: MyRepository
init {
App.appComponent.inject(this)
}
}
一般来说,如果可能的话,您应该更喜欢构造函数注入。该规则的例外情况是由系统实例化的类 - 活动、片段等。
构造函数注入的一大好处是它使你的类更容易测试,很容易创建实例并用模拟/假货/任何你喜欢的东西替换依赖项。
我相信使用 Dagger 进行构造函数注入时也有一些效率/性能优势,需要更少的代码生成等。
您还应该考虑使用 Hilt,它可以消除所有样板代码:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
...
}
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: SomeRepository,
private val useCase: SomeUseCase
) : ViewModel() {
....
}