如果没有提供注释的方法,则无法提供Android匕首

时间:2018-06-26 16:40:25

标签: android kotlin dagger-2

我决定学习class TouchMock: UITouch { var y: CGFloat init(y: CGFloat) { self.y = y super.init() } override func location(in view: UIView?) -> CGPoint { return CGPoint(x: 10, y: y) } } func sendTouchesBegan(y: CGFloat, to view: UIView) { let touch = TouchMock(y: y) view.touchesBegan([touch], with: nil) } func sendTouchesMoved(y: CGFloat, to view: UIView) { let touch = TouchMock(y: y) view.touchesMoved([touch], with: nil) } func sendTouchesEnded(y: CGFloat, to view: UIView) { let touch = TouchMock(y: y) view.touchesEnded([touch], with: nil) } func sendTouchesCancelled(y: CGFloat, to view: UIView) { let touch = TouchMock(y: y) view.touchesCancelled([touch], with: nil) } 依赖项注入框架。经过一些教程之后,我尝试将匕首实现到我的项目中。但是我遇到了这个错误

dagger

我尝试解决2天,但是没有运气。因此,这就是我设置项目的方式

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

这是我的appModule类

AppModule

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

那么这个实现我缺少什么?

3 个答案:

答案 0 :(得分:3)

将AndroidInjectionModule.class和ActivityBuilder.class添加到您的AppComponent

node_modules

答案 1 :(得分:1)

您有两个问题。

要摆脱编译器错误,请向组件模块中添加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方法)。 / p>

使用这种声明,您可以使用application(this)构建组件:

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

通过这种方式,this应用程序实例被绑定到组件内部。

作为一个旁注:绑定实例已记录在here中,但是我个人认为对于像我这样的学习匕首的人来说,很难理解该解释。

答案 2 :(得分:0)

  

详细答案和解释

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

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

我们创建了 ActivityModule 模块。这是给匕首module。我们在这里映射所有activities。并且 Dagger 知道我们在activities中的compile time。在我们的应用中,我们有 MainActivity 。所以我们在这里映射。

@Module
abstract class ActivityModule {

    @ContributesAndroidInjector
    public abstract MainActivity bindMainActivity();
}

AndroidManifest.xml

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

App.kt

class App : DaggerApplication() {

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

并确保使用 DaggerAppCompatActivity 扩展您的活动,该活动将在onCreate之前自动注入