“dagger-android”库,如何提供Context(Application)?

时间:2018-04-23 03:32:53

标签: android kotlin dagger

令人困惑的是,所有网络搜索结果似乎都使用略有不同版本的Dagger或不同的方法。我遵循的例子声称这是更好的“新方式”。 (https://proandroiddev.com/exploring-the-new-dagger-android-module-9eb6075f1a46)完整的示例源代码在此处(https://github.com/jshvarts/DaggerAndroidKotlinSampleApp)。

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

class Sample2 @Inject constructor (var app: Application)
{
    fun print()
    {
        Log.d("sample2", app.packageName);
    }
}

但即使示例项目有AppModule和AppComponent,编译也会失败,因为无法提供app。

我在网上搜索过并发现了这种方法(https://github.com/google/dagger/issues/832)。我按照那个代码修改了样本的AppModule和AppComponent,就像这样,

@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.java:7:错误:@Module可能不包含非静态@Provides方法和抽象@Binds或@Multibinds声明   公共抽象类AppModule {

同样,正如我在开始时所说的,互联网上的Dagger示例都略有不同,我不知道如何从两个示例中获取两个特征。

1 个答案:

答案 0 :(得分:1)

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

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

interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(app: Application): Builder
        fun build(): AppComponent
}
}

然后是所有@Provides

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