在Android ViewModel中注入依赖项?
嗨,我有一个ViewModel,它有两个var,使用Dagger 2.11注入 然而,它从未在我的viewModel中注入,而在我的应用程序的其他地方,这些依赖变量被初始化并完美注入 下面是我的viewModel在Android ViewModel中注入依赖项?,android,dagger-2,android-viewmodel,Android,Dagger 2,Android Viewmodel,嗨,我有一个ViewModel,它有两个var,使用Dagger 2.11注入 然而,它从未在我的viewModel中注入,而在我的应用程序的其他地方,这些依赖变量被初始化并完美注入 下面是我的viewModel class MyViewModel : AndroidViewModel, MyViewModelContract { private lateinit var pointsBalance: MutableLiveData<PointsBalance>
class MyViewModel : AndroidViewModel, MyViewModelContract {
private lateinit var pointsBalance: MutableLiveData<PointsBalance>
@Inject
lateinit var accountDelegator: AccountDelegatorContract
@Inject
constructor(application: Application) : super(application)
init {
DaggerApplicationComponent.builder().application(getApplication() as MyApplication).build().inject(this)
}
override fun getPointsBalance(): LiveData<PointsBalance> {
if (!this::pointsBalance.isInitialized) {
//get balance from network api etc
}
return pointsBalance
}
我的自定义应用程序
class MyApplication : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
val applicationComponent = DaggerApplicationComponent.builder()
.application(this)
.build()
applicationComponent.inject(this)
return applicationComponent
}
}
我认为问题在于您没有调用
inject
。您需要开始将以下内容添加到ApplicationComponent
void inject(MyViewModel viewModel);
我在这里所做的是,fwiw继承了AndroidViewModel
(它提供了对应用程序实例的访问),然后在ViewModel类中调用以下内容(您需要用在代码中访问组件的方式替换DaggerProvider.getComponent
)
我现在遇到了这个错误:无法创建MyViewModelOk类的实例,尽管我已经修复了这个错误,但是我仍然遇到了依赖项变量不可用的问题injected@jonney您的
init
中有什么内容?我已经更新了我的答案,以描述我添加到构造函数和inithmm中的内容,在这种情况下,不确定问题是什么。fwiw在另一个项目中,我再次使用了一种可能有用的方法(使用注入到Activity/Fragment中的ViewModelProvider.Factory
实例)-
@Singleton
@Component(modules = arrayOf(MyModule::class,
))
interface ApplicationComponent : AndroidInjector<DaggerApplication> {
fun inject(mApplication: MyApplication)
override fun inject(instance: DaggerApplication)
@Component.Builder
interface Builder {
@BindsInstance
fun application(applicaton: MyApplication): Builder
fun build(): ApplicationComponent
}
}
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
void inject(MyViewModel viewModel);
init {
DaggerProvider.getComponent(application).inject(this)
}