Dagger2 - 在 ViewModel 中注入变量的字段。有问题吗?

问题描述 投票:0回答:1

我最近学习了dagger2,遇到了一种情况,我必须在我的视图模型中注入一个类的变量。 几乎在所有地方,建议通过 ViewModelFactory 传递该变量并将该变量注入 ViewModel Factory 构造函数中。 但是,从技术上讲,我也可以在 viewmodel 中注入一个字段,并在 viewmodel 的 init() 函数中调用 component.init 方法。我仍然可以在我的视图模型中使用该变量,而无需创建视图模型工厂。 这个方法有什么问题吗?

例如 我的视图模型

class MainActivityViewModel() : ViewModel() {

    @Inject
    lateinit var repository: MyRepository
    
    init {
        App.appComponent.inject(this)
    }
}
android dependency-injection viewmodel dagger-2
1个回答
0
投票

一般来说,如果可能的话,您应该更喜欢构造函数注入。该规则的例外情况是由系统实例化的类 - 活动、片段等。

构造函数注入的一大好处是它使你的类更容易测试,很容易创建实例并用模拟/假货/任何你喜欢的东西替换依赖项。

我相信使用 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() {

    ....
}
© www.soinside.com 2019 - 2024. All rights reserved.