对于ViewModels只有编译时依赖项,我使用ViewModelProvider.Factory来自架构的组件,如下所示:
class ViewModelFactory<T : ViewModel> @Inject constructor(private val viewModel: Lazy<T>) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>): T = viewModel.get() as T
}
Run Code Online (Sandbox Code Playgroud)
在我Activity或Fragment我得到ViewModel以下方式:
@Inject
lateinit var viewModelFactory: ViewModelFactory<ProductsViewModel>
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到我ViewModel需要一个仅在运行时可用的依赖项。
场景是,我有一个列表Product,我在RecyclerView. 对于每个Product,我都有ProductViewModel。
现在,ProductViewModel需要各种依赖关系的喜欢ResourceProvider,AlertManager等这些都可以编译时,我可以Inject他们使用 constructor 或者我可以Provide他们使用Module。但是,除了上述依赖项之外,它还需要Product对象,该对象仅在运行时可用,因为我通过 API 调用获取产品列表。
我不知道如何注入仅在运行时可用的依赖项。所以我现在正在做以下事情: …
android dependency-injection assisted-inject dagger-2 android-viewmodel
使用Google Guice或Gin我可以指定参数不受依赖注入框架控制:
class SomeEditor {
@Inject
public SomeEditor(SomeClassA a, @Assisted("stage") SomeClassB b) {
}
}
Run Code Online (Sandbox Code Playgroud)
辅助参数stage在SomeEditor创建实例时指定.
SomeClassA的实例取自对象图,SomeClassB的实例在运行时从调用者获取.
在Dagger中有类似的方法吗?