Как ввести номер? - PullRequest
0 голосов
/ 09 октября 2019

Мое приложение имеет 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)

1 Ответ

1 голос
/ 10 октября 2019

Этот код управляет вашим экземпляром.

@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
  }
...