【问题标题】:How to inject Context into a Presenter using Dagger 2如何使用 Dagger 2 将 Context 注入 Presenter
【发布时间】:2018-01-21 06:30:08
【问题描述】:

我最近一直在使用新的 Android 注入器检查 Dagger 2.14.1。

我正在使用 MVP,Presenter 正在正确地注入视图:

class CustomApplication : Application(), HasActivityInjector {

    @Inject
    lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

    override fun onCreate() {
        super.onCreate()
        DaggerApplicationComponent
                .builder()
                .create(this)
                .inject(this)
    }

    override fun activityInjector(): DispatchingAndroidInjector<Activity> {
        return activityDispatchingAndroidInjector
    }
}

--

@Singleton
@Suppress("UNUSED")
@Component(modules = arrayOf(AndroidInjectionModule::class, ApplicationModule::class, ActivityBuilder::class))
interface ApplicationComponent : AndroidInjector<CustomApplication> {

    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<CustomApplication>()

    override fun inject(application: CustomApplication)
}

--

@Module
class ApplicationModule {

    @Provides
    @Singleton
    fun provideContext(application: Application): Context {
        return application
    }
}

--

@Module
@Suppress("UNUSED")
abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = arrayOf(ActivitiesModule::class))
    internal abstract fun bindSplashActivity(): SplashActivity
}

--

@Singleton
class SplashPresenter @Inject constructor() {

    fun test() {
        Log.d("TAG", "this is a test")
    }
}

现在,我不想对记录的消息进行编码,而是想从 string.xml 中获取它,所以我尝试了这个:

@Singleton
class SplashPresenter @Inject constructor(private val context: Context) {

    fun test() {
        Log.d("TAG", context.getString(R.strings.test))
    }
}

然后我得到这个错误:

错误:(7, 1) 错误: [dagger.android.AndroidInjector.inject(T)] 没有@Inject 就无法提供 android.app.Application 构造函数或来自 @Provides 注释的方法。

谁能告诉我如何将应用上下文(或资源)注入演示者?

谢谢。

【问题讨论】:

  • 为什么在 Presenter 中需要上下文?在 MVP 逻辑中,演示者不应该有 Android 上下文(或任何其他 Android 类)的概念。
  • 我从 Activity onActivityResult 的 3rd 方库中获取了一些信息,因此为了验证一些我认为不应该在 Activity 上完成的信息,但是而是在 Presenter 中,为了避免硬编码值,我认为最好将它们放在 strings.xml

标签: android dependency-injection kotlin dagger-2 dagger


【解决方案1】:

你在你的ApplicationComponent 中使用了CustomApplication 和Dagger,所以这就是它所知道的。它不会尝试自行解析类型,因此 Application 是 Dagger 从未听说过的一些类。

您可以添加另一个@Provides / @Binds 来绑定CustomApplication &gt; Application &gt; Context,或者直接将代码更改为需要CustomApplication 而不是Application

@Provides
@Singleton
fun provideContext(application: CustomApplication): Context {
    return application
}

  // ... or alternatively ...

@Provides
@Singleton
fun provideApplication(application: CustomApplication): Application {
    return application
}

@Provides
@Singleton
fun provideContext(application: Application): Context {
    return application
}

无论哪种方式,您的应用程序都可以用作Context

【讨论】:

  • 我收到编译错误This type supports members injection but cannot be implicitly provided. 有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多