【发布时间】: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