【发布时间】:2018-03-26 06:30:41
【问题描述】:
我有以下用于房间模块的匕首实现。这会导致在ViewModel 类中注入RoomMoule 时出错。
以下是我的代码:
应用
class App : DaggerApplication(), HasActivityInjector {
@Inject
lateinit var activityDispatchInjector: DispatchingAndroidInjector<Activity>
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().create(this)
}
override fun activityInjector(): DispatchingAndroidInjector<Activity> {
return activityDispatchInjector
}
}
AppModule
@Module
class AppModule {
@Provides
@Singleton
fun providesContext(app: Application): Context = app
}
房间模块
@Module
class RoomModule {
@Singleton
@Provides
fun provideAppDatabase(context: Context): AppRoomDataBase =
Room.databaseBuilder(context,
AppRoomDataBase::class.java, "sample.db")
.build()
@Singleton
@Provides
fun provideRepository(appRoomDataBase: AppRoomDataBase): ResultRepository {
return ResultRepository(appRoomDataBase)
}
}
应用组件
@Singleton
@Component(modules = [
(AndroidSupportInjectionModule::class),
(AppModule::class),
(ActivityModule::class),
(FragmentModule::class),
(ViewModelModule::class),
(RoomModule::class)])
interface AppComponent : AndroidInjector<App> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<App>()
}
HomeViewModel
class HomeViewModel @Inject constructor() : ViewModel() {
@Inject lateinit var resultRepository: ResultRepository
private var liveList: LiveData<List<Result>>? = null
fun getResults(): LiveData<List<Result>>? {
liveList = resultRepository.findAll()
return liveList
}
}
结果存储库
class ResultRepository(appRoomDB : AppRoomDataBase) {
val mAppDb : AppRoomDataBase = appRoomDB
fun findAll(): LiveData<List<Result>> {
return mAppDb.resultDao().getAll()
}
}
在构建这个时,我得到了错误
AppComponent.java:11: error: [dagger.android.AndroidInjector.inject(T)]
android.app.Application cannot be provided without an @Inject constructor or
from an @Provides-annotated method.
public abstract interface AppComponent extends
dagger.android.AndroidInjector<com.dailypay.base.App> {
^
android.app.Application is injected at
com.dailypay.di.AppModule.providesContext(app)
android.content.Context is injected at
com.dailypay.di.RoomModule.provideAppDatabase(context)
com.dailypay.room.AppRoomDataBase is injected at
com.dailypay.di.RoomModule.provideRepository(appRoomDataBase)
com.dailypay.repo.ResultRepository is injected at
com.dailypay.ui.home.HomeViewModel.resultRepository
com.dailypay.ui.home.HomeViewModel is injected at
com.dailypay.di.ViewModelModule.bindMainViewModel(mainViewModel)
java.util.Map<java.lang.Class<? extends android.arch.lifecycle.ViewModel>,javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected at
com.dailypay.di.ViewModelFactory.<init>(creators)
com.dailypay.di.ViewModelFactory is injected at
com.dailypay.di.ActivityModule.bindViewModelFactory(factory)
android.arch.lifecycle.ViewModelProvider.Factory is injected at
com.dailypay.ui.home.HomeFragment.viewModelFactory
com.dailypay.ui.home.HomeFragment is injected at
dagger.android.AndroidInjector.inject(arg0)
:app:kaptDebugKotlin 失败
FAILURE:构建失败并出现异常。
【问题讨论】:
-
发布您的
ResultRepository代码....我想您需要在ResultRepository构造函数上提供注入注解 -
我认为 dagger 不知道如何提供(在哪里找到)上下文。尝试将包含参数添加到您的模块:@Module(includes = arrayOf(ModuleWithMethodProvideContext::class)).
-
@Burhanuddin Rashid 我尝试使用@inject 构造函数,但我遇到了同样的错误...BTW ResultRepository added
-
@LvN 你试过这个
class ResultRepository @Inject constructor(appRoomDB : AppRoomDataBase) {..吗? -
@Raghunandan 是的,我试过了..得到了同样的错误..我相信某处发生了一些循环依赖
标签: android kotlin dagger-2 android-room dagger