“dagger android”库,如何提供上下文(应用程序)?

“dagger android”库,如何提供上下文(应用程序)?,android,kotlin,dagger,Android,Kotlin,Dagger,令人困惑的是,所有的网络搜索结果似乎都使用了略微不同的Dagger版本或不同的方法。我遵循的例子声称这是更好的新方法。完整的示例源代码在这里 现在,我想知道如何为非活动/片段类提供上下文。所以,我添加了这样一个简单的类 class Sample2 @Inject constructor (var app: Application) { fun print() { Log.d("sample2", app.packageName); } } @Module

令人困惑的是,所有的网络搜索结果似乎都使用了略微不同的Dagger版本或不同的方法。我遵循的例子声称这是更好的新方法。完整的示例源代码在这里

现在,我想知道如何为非活动/片段类提供上下文。所以,我添加了这样一个简单的类

class Sample2 @Inject constructor (var app: Application)
{
    fun print()
    {
        Log.d("sample2", app.packageName);
    }
}
@Module(includes = [AndroidInjectionModule::class])
abstract class AppModule {
    @Binds
    abstract fun application(app: App):Application;

    @Singleton
    @Provides
    fun providesCommonHelloService() = CommonHelloService()
}

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

class App : Application(), HasActivityInjector {
    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate()
    {
        super.onCreate()

        DaggerAppComponent.builder().create(this).inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
但是,即使示例项目有AppModule和AppComponent,编译还是失败了,因为无法提供AppModule和AppComponent

我在网上搜索了一下,找到了这个方法。我按照代码修改了示例的AppModule和AppComponent,如下所示

class Sample2 @Inject constructor (var app: Application)
{
    fun print()
    {
        Log.d("sample2", app.packageName);
    }
}
@Module(includes = [AndroidInjectionModule::class])
abstract class AppModule {
    @Binds
    abstract fun application(app: App):Application;

    @Singleton
    @Provides
    fun providesCommonHelloService() = CommonHelloService()
}

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

class App : Application(), HasActivityInjector {
    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate()
    {
        super.onCreate()

        DaggerAppComponent.builder().create(this).inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
但是,我得到以下编译错误

java:7:错误:@Module不能同时包含非静态@Provides方法和抽象@Binds或@Multibinds声明 公共抽象类AppModule{


同样,正如我在开始时所说,Internet上的Dagger示例都略有不同,我不知道如何从两个示例中提取两个功能。

最好将@Binds和@Provides分开,您可以创建一个组件类:

@Singleton
@Component(
    modules = [(AppModule::class)]
)

interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(app: Application): Builder
        fun build(): AppComponent
}
}
然后为所有@提供一个AppModule类

@Module
class AppModule() {
   @Singleton
   @Provides
   fun providesCommonHelloService() = CommonHelloService()
}

我正在打电话,或者我会提供一个正确的答案。因为我不能,请看这篇博客文章,它准确地描述了如何做你想做的事。完整披露:我写了这篇文章。