代码之家  ›  专栏  ›  技术社区  ›  David

如果没有提供带注释的方法,就不能提供Android dagger

  •  1
  • David  · 技术社区  · 7 年前

    dagger

    com\assigment\di\component\AppComponent.java:11: error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> cannot be provided without an @Provides-annotated method.
        public abstract void inject(@org.jetbrains.annotations.NotNull()
                             ^
          java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> is injected at
              dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
          dagger.android.DispatchingAndroidInjector<android.app.Activity> is injected at
              assigment.com.assigment.App.activityInjector
          assigment.com.assigment.App is injected at
              assigment.com.assigment.di.component.AppComponent.inject(assigment.com.assigment.App)
    

    class App : Application(), HasActivityInjector  {
        @Inject
        lateinit var activityInjector: DispatchingAndroidInjector<Activity>
    
        lateinit var appComponent: AppComponent
    
        override fun onCreate() {
            super.onCreate()
    
            appComponent = DaggerAppComponent
                    .builder()
                    .appModule(AppModule())
                    .build()
        }
    
        override fun activityInjector(): AndroidInjector<Activity> {
            return activityInjector
        }
    }
    

    这是我的应用程序组件

    @Singleton
    @Component(modules = [AppModule::class])
    
    interface AppComponent : AndroidInjector<App> {
    
        @Component.Builder
        interface Builder {
            @BindsInstance
            fun application(application: Application): Builder
            fun build(): AppComponent
        }
        override fun inject(app: App)
    }
    

    这是我的appModule类

    应用程序模块

    @Module
    class AppModule {
        private val url = "http://test.lt/v1/"
    
        @Provides
        @Singleton
        fun provideApplication(app: Application): Context = app
    }
    

    2 回复  |  直到 7 年前
        1
  •  17
  •   eurosecom    7 年前

    添加droidInjectionModule.class类以及ActivityBuilder.class类到AppComponent

    @Singleton
    @Component(modules = [AndroidInjectionModule::class, AppModule::class, ActivityBuilder::class ])
    
    interface AppComponent : AndroidInjector<App> {
    
      @Component.Builder
      interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
      }
     override fun inject(app: App)
    }
    
        2
  •  5
  •   attdona    7 年前

    你有两个问题。

    要消除编译器错误,请添加 AndroidInjectionModule::class

    @Singleton
    @Component(modules = [AndroidInjectionModule::class, AppModule::class])
    interface AppComponent : AndroidInjector<App> {
    
    
        @Component.Builder
        interface Builder {
            @BindsInstance
            fun application(application: Application): Builder
            fun build(): AppComponent
        }
    
        override fun inject(app: App)
    }
    

    @Component.Builder 带注释的接口使用带注释的 @BindsInstance 方法 application() (请注意,没有 appModule

    通过这样的声明,您可以使用 application(this) :

        appComponent = DaggerAppComponent
                .builder()
                .application(this)
                .build()
    

    this

    顺便说一句:绑定实例是有文档记录的 here

        3
  •  1
  •   Zar E Ahmer    5 年前

    详细回答并解释

    组件是一个图形。组件将使用模块提供注入实例。

    @Component(
        modules = [
            AndroidInjectionModule::class, //We didn’t create this. It is an internal class in Dagger 2.10. Provides our activities and fragments with given module
            ActivityModule::class,
        ]
    )
    @Singleton
    interface AppComponent : AndroidInjector<App> {
    
        @Component.Builder
        interface Builder {
            fun addContext(@BindsInstance context: Context): Builder
            fun build(): AppComponent
        }
    }
    

    我们创造了 活动模块 module 匕首 . 我们绘制了所有的地图 activities 匕首 了解我们的 活动 在里面 compile time . 在我们的应用程序中 主要活动 . 所以我们把它画在这里。

    @Module
    abstract class ActivityModule {
    
        @ContributesAndroidInjector
        public abstract MainActivity bindMainActivity();
    }
    

    <?xml version="1.0" encoding="utf-8"?>
    <manifest>
        <application
            android:name=".App"
    

    约kt

    class App : DaggerApplication() {
    
        override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
            return DaggerAppComponent.builder().addContext(this).build()
        }
    }
    

    DaggerAppCompative活动