1

What does this deprecated warning for AndroidInjector.Builder mean and how do I fix it?

AppComponent.kt

@Component(modules = [AndroidInjectionModule::class, AppModule::class])
@Singleton
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<App>() {

        @BindsInstance
        abstract fun application(@ApplicationContext context: Context)

        @BindsInstance
        abstract fun baseUrl(@Named("baseUrl") baseUrl: String): Builder

        @BindsInstance
        abstract fun secret(@Named("secret") secret: String): Builder

        override fun seedInstance(instance: App) {
            application(instance)
        }
    }
}

App.kt

class App : DaggerApplication(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Any>

    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder()
        .baseUrl(SdkConstants.BASE_URL)
        .secret(BuildConfig.SECRET)
        .create(this)
    }

    override fun onCreate() {
        super.onCreate()
    }

    override fun androidInjector() = androidInjector

}
Daniel Wilson
  • 18,838
  • 12
  • 85
  • 135
  • 1
    That `@Component.Builder` is now deprecated (read in a future might disappear) and you should use `@Component.Factory` instead. Factories have a simpler API, just one call which takes all the arguments which otherwise are one function each on the builder – al3c Apr 21 '20 at 17:11
  • Thanks @al3c , with a bit more Googling I think I have it now and will add an answer – Daniel Wilson Apr 21 '20 at 17:57

1 Answers1

3

I believe I have the answer now, @Component.Builder is replaced with:

@Component.Factory
    interface Factory {
        fun create(@BindsInstance @ApplicationContext context: Context,
                   @BindsInstance @Named("baseUrl") baseUrl: String,
                   @BindsInstance @Named("secret") secret: String): AppComponent
    }

App's applicationInjector is replaced with:

override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
    return DaggerAppComponent.factory().create(this, SdkConstants.BASE_URL, BuildConfig.SECRET)
}
Daniel Wilson
  • 18,838
  • 12
  • 85
  • 135