Kotlin dagger 2, returning a type with a common in ApplicationComponent

I want to return a type with subgraphs common for display, the problem is automatically generated java classes, I tried to do something, but one way to solve it is to remove the common type from the AppComponent and return a simple object. Is there a more “right” approach?

Here is the AppComponent

@Singleton
@Component(modules = arrayOf(ApplicationModule::class))
interface ApplicationComponent {
    fun inject(activity: BaseActivity<MvpView, MvpPresenter<MvpView>>)

    //...
    fun dataBase(): Database<Realm>
}

here is the function in ApplicationModule

@Provides @Singleton fun provideDatabase(@AppContext context: App): Database<Realm> {
    Realm.init(context)
    val config = RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .name("db")
            .build()
    Realm.setDefaultConfiguration(config)
    return RealmDatabase(Realm.getDefaultInstance())
}

Then I want to get my database

@Provides @ActivityScope fun provideDich(database: Database<Realm>) = Someobject(database)

And then I see a magazine that says:

**Error:com.test.data.storage.Database<? extends io.realm.Realm> cannot be provided without an @Provides-annotated method.**

Since dagger2 generates such factories, there are java masks

    public final class Logout_Factory implements Factory<Logout> {
  private final MembersInjector<Logout> logoutMembersInjector;

  private final Provider<SessionStorage.CloudStorage> arg0Provider;

  private final Provider<Database<? extends Realm>> arg1Provider;

  public Logout_Factory(
      MembersInjector<Logout> logoutMembersInjector,
      Provider<SessionStorage.CloudStorage> arg0Provider,
      Provider<Database<? extends Realm>> arg1Provider) {
    assert logoutMembersInjector != null;
    this.logoutMembersInjector = logoutMembersInjector;
    assert arg0Provider != null;
    this.arg0Provider = arg0Provider;
    assert arg1Provider != null;
    this.arg1Provider = arg1Provider;
  }

  @Override
  public Logout get() {
    return MembersInjectors.injectMembers(
        logoutMembersInjector, new Logout(arg0Provider.get(), arg1Provider.get()));
  }

  public static Factory<Logout> create(
      MembersInjector<Logout> logoutMembersInjector,
      Provider<SessionStorage.CloudStorage> arg0Provider,
      Provider<Database<? extends Realm>> arg1Provider) {
    return new Logout_Factory(logoutMembersInjector, arg0Provider, arg1Provider);
  }
}
+4
source share
1 answer

I had the same problem and found a solution.

@JvmWildcard @Provide.

@Provides 
@Singleton 
fun provideDatabase(@AppContext context: App): Database<@JvmWildcard Realm> {
    Realm.init(context)
    val config = RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .name("db")
            .build()
    Realm.setDefaultConfiguration(config)
    return RealmDatabase(Realm.getDefaultInstance())
}
+4

Source: https://habr.com/ru/post/1666359/


All Articles