Мое приложение имеет DI. Он включает в себя RoomModule и RoomComponent.
RoomModule.kt
@Module
class RoomModule(private val app: Application) {
val localDatabase: LocalDatabase = Room
.databaseBuilder(app, LocalDatabase::class.java, "local-db")
.build()
@Provides
@Singleton
internal fun providesApplication(): Application {
return app
}
@Singleton
@Provides
internal fun providesRoomDatabase(): LocalDatabase {
return localDatabase
}
@Singleton
@Provides
internal fun providesUserDao(localDatabase: LocalDatabase): UserDao {
return localDatabase.getUserDao()
}
@Singleton
@Provides
internal fun providesUserRepo(userDao: UserDao): UserRepo {
return UserDataSource(userDao)
}
}
RoomComponent.kt
@Singleton
@Component(dependencies = [], modules = [RoomModule::class])
interface RoomComponent {
fun userDao(): UserDao
fun localDatabase(): LocalDatabase
fun userRepo(): UserRepo
}
Для создания RoomDatabase мне нужно приложениеПоэтому я делаю следующее в своей первой деятельности.
MyActivity.java
public class MyActivity extends MvpAppCompatActivity {
@Inject
Interactor interactor;
@InjectPresenter
Presenter presenter;
@ProvidePresenter
Presenter providePresenter(){
DaggerAppComponent.builder()
.build()
.inject(this);
return new Presenter(interactor);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myactivity);
DaggerRoomComponent.builder()
.roomModule(new RoomModule(getApplication()))
.build();
...
presenter.someMethod();
}
...
Далее это действие вызывает метод в Presentor. Presentor вызывает метод в Interactor, где я хочу внедрить RoomDatabase.
Presentor.kt
@InjectViewState
class Presenter(val interactor:
Interactor): MvpPresenter<MyView>(){
fun someMethod(){
if (interactor.getUser() != null) {
// TODO smth...
}
}
...
Interactor.kt
@Inject
lateinit var userRepo: UserRepo //null
override fun getUser(): User? {
// Using userRepo
}
Но переменная равна нулю.
Проблема в том, что в классе, где мне нужна база данных, нет контекста, который необходим для ее создания. Посмотрите на визуализацию моей проблемы
Я реализовал код, описанный в этом ответе Класс Dagger2 Inject с параметром (используя Room)