如何注入房间?

时间:2019-10-09 20:24:43

标签: android kotlin dependency-injection android-room dagger-2

我的应用程序具有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

我实现了此答案Dagger2 Inject class with parameter (using Room)

中描述的代码

1 个答案:

答案 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
  }