如何使用Dagger 2.14.1向Presenter注入App Context?解决注入报错
嘿,我来帮你搞定这个Dagger注入的报错问题!
首先咱们先拆解下报错原因:
Error:(7, 1) error: [dagger.android.AndroidInjector.inject(T)] android.app.Application cannot be provided without an @Inject constructor or from an @Provides-annotated method.
这个错误本质是Dagger找不到android.app.Application的依赖提供者。虽然你的CustomApplication是Application的子类,但Dagger不会自动把子类实例向上转型为父类提供,必须咱们明确告诉它怎么获取Application实例。
具体解决方案
方案一:直接使用CustomApplication作为依赖参数
修改你的ApplicationModule,把provideContext方法的参数换成CustomApplication——因为你的ApplicationComponent是绑定到CustomApplication的,Dagger可以直接注入这个实例,返回它作为Context即可:
@Module class ApplicationModule { @Provides @Singleton fun provideContext(application: CustomApplication): Context { return application } }
方案二:新增Application的提供者方法
如果想保持参数为Application,可以在ApplicationModule里新增一个@Provides方法,专门提供Application实例:
@Module class ApplicationModule { @Provides @Singleton fun provideApplication(application: CustomApplication): Application { return application } @Provides @Singleton fun provideContext(application: Application): Context { return application } }
额外注意事项
还有个小细节要修正:你Presenter里的context.getString(R.strings.test)写错了,应该是R.string.test(去掉strings里的s),不然会出现资源找不到的编译错误哦!
另外,确保你的SplashActivity完成了正确注入:如果没有继承DaggerActivity,记得在onCreate方法开头调用AndroidInjection.inject(this),示例代码如下:
class SplashActivity : AppCompatActivity() { @Inject lateinit var presenter: SplashPresenter override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) presenter.test() } }
这样修改后,Dagger就能正确把App Context注入到SplashPresenter里,你从string.xml获取日志消息的需求就能正常实现啦~
内容的提问来源于stack exchange,提问作者Guillermo Antonio Varela Herre

