我的应用程序具有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
}
但是变量为空。
问题是在我需要数据库的类中没有创建它所必需的Context。 Look at the visualization of my problem
中描述的代码答案 0 :(得分:1)
此代码控制您的实例。
@Singleton
@Provides
internal fun providesRoomDatabase(): LocalDatabase {
return localDatabase
}
要创建实例并使其可注入,您应通过providesRoomDatabase
提供它,如下所示:
@Singleton
@Provides
internal fun providesRoomDatabase(): LocalDatabase {
val localDatabase: LocalDatabase = Room
.databaseBuilder(app, LocalDatabase::class.java, "local-db")
.build()
return localDatabase
}