【问题标题】:"dagger-android" library, how to provide Context(Application)?“dagger-android”库,如何提供上下文(应用程序)?
【发布时间】:2018-04-23 03:32:53
【问题描述】:

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

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

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例子都略有不同,我不知道如何从两个例子中取两个特征。

【问题讨论】:

  • 我正在打电话,否则我会提供正确的答案。由于我不能,请查看这篇博客文章,该文章准确描述了如何做你想做的事。完全披露:我写了这篇文章。 dev.to/autonomousapps/…

标签: android kotlin dagger


【解决方案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()
}

【讨论】:

    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2022-10-15
    • 2020-02-07
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多