I'm trying to inject a set of Room components into a Repository which is itself injected into a ViewModel (which is in a fragment) using Dagger2.
The code is as follows.
Fragment:
class MyFragment : Fragment() {
private var viewModel: MyViewModel? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
viewModel!!.init()
viewModel!!.getUser().observe(this, Observer<MyClass?> {...})
}
...
}
View Model:
class MyViewModel : ViewModel() {
@Inject lateinit var myRepo: MyRepository
private var instance: LiveData<MyClass>? = null
fun init() {
DaggerAppComponent.builder()
.build().daggerInject(this)
if (this.instance != null) {
return
}
instance = myRepo.getInstance()
}
}
My Repository:
@Singleton
class MyRepository {
@Inject lateinit var myDao: MyDao
@Inject lateinit var executor: Executor
init {
DaggerAppComponent.builder().build().daggerInject(this)
}
}
Finally for my dagger classes I have two modules:
@Module(includes = [AndroidInjectionModule::class])
abstract class AppModule {
@Binds
abstract fun application(app: MyApplication): MyApplication
}
@Module
class DataModule {
@Inject
lateinit var application: MyApplication
val myDatabase = Room.databaseBuilder(application, MyDatabase::class.java, "my-database").build()
@Provides
@Singleton
fun provideRepository(): MyRepository {
return MyRepository()
}
@Provides
fun provideMyDao(): MyDao {
return MyDao_Impl(myDatabase)
}
@Provides
fun providesExecutor(): Executor {
return Executors.newSingleThreadExecutor()
}
}
And my AppComponent:
@Singleton
@Component(modules = [AppModule::class, DataModule::class])
interface AppComponent : AndroidInjector<MyApplication> {
fun daggerInject(viewModel: MyViewModel)
fun daggerInject(myRepo: MyRepository)
@Component.Builder
abstract class Builder: AndroidInjector.Builder<MyApplication>()
}
Dagger compiles fine, I can access the DaggerAppComponent and build it. However dataModule is inaccessible (inspecting the class shows it as private) as are the daggerInject methods I need to actually inject the dependencies. As a result I get the error:
Unresolved reference: daggerInject
How do I solve this?
@Singletonif you create a new component for each class you're creating...? - EpicPandaForce