时间:2021-05-20
Dagger2是什么?
Dagger2是一款基于Java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试。
一、Kotlin Dagger2 配置
build.gradle
apply plugin: 'com.android.library'apply plugin: 'kotlin-android'apply plugin: 'kotlin-kapt'...dependencies {... //dagger2 compile rootProject.ext.dependencies["dagger"] kapt rootProject.ext.apt["dagger-compiler"] //dagger2 android 一个dagger2 关于Android的增强库 可选项 compile rootProject.ext.dependencies["dagger-android"] //可选项 compile rootProject.ext.dependencies["dagger-android-support"] //可选项 kapt rootProject.ext.apt["dagger-android-processor"]}AppComponent
@Singleton@Component(modules = arrayOf(AppModule::class))interface AppComponent { fun inject(app: BaseApplication)}AppModule
@Moduleclass AppModule(val app: Application) { @Provides @Singleton fun provideApplication() = app}Application
class BaseApplication : Application() { override fun onCreate() { super.onCreate() initApplication() DaggerCoreComponent .builder() .coreModule(CoreModule(this)) .build(); }}以上配置完成,就可以愉快的在Kotlin中使用Dagger2了。
更多关于Kotlin Dagger2配置的内容可以参考这里:
二、Kotlin使用Dagger2遇到的坑
当时我想将presenter注入到Activity中,代码如下,make Projiect的时候不通过 百思不得其解
坑1
class MainActivity : AppCompatActivity() ,MainContract.View { @Inject var mPresenter : MainContract.Presenter ? = null override fun onCreate(savedInstanceState: Bundle?) { //******// super.onCreate(savedInstanceState) DaggerMainActivityComponent.builder().build().inject(this) mPresenter?.subscribe() } @Module inner class PresenterModules { @Provides fun providePresenter(): MainContract.Presenter { return MainPresenter(this@MainActivity) } }}@Component(modules = arrayOf(MainActivity.PresenterModules::class))interface MainActivityComponent { fun inject(activity: MainActivity)}然后我将kotlin 代码 转成字节码后再转成java代码,发现Presenter是私有的.
而我们都知道,注入的对象不可以是私有的
public final class MainActivity extends AppCompatActivity implements View { @Inject @Nullable private Presenter mPresenter;-----省略}//于是将上述代码改成 @Inject @JvmField var mPresenter : MainContract.Presenter ? = null//或则@Injectlateinit mPresenter : MainContract.Presenter即可编译成功
坑2
@Inject @JvmField// @Named("preneter")// 错误 正确的做法如下 @field:[Named("preneter")] var mPresenter : MainContract.Presenter ? = null @Module inner class PresenterModules { @Provides @Named("preneter") fun providePresenter(): MainContract.Presenter { return MainPresenter(this@MainActivity) } @Provides @Named("hello") fun provide():String{ return "hello" } }总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言陆陆续续几篇文章已经讲解了项目中Kotlin如何配置、简单语法、DataBinding配置,接下来就要说到Kotlin中的Dagger2了。配置Dagger
前言前段时间,公司项目使用到了Dagger2,之前自己倒是听说过Dagger2,但是一直没有去使用,主要是因为入门难度相对于Rxjava,Retrofit要高不
本文假设读者已经有一定Dagger2使用经验使用疑惑之前工作中一直在使用dagger2进行开发,用起来确实很爽,但是我从我第一次使用我就一直有一个问题或者说疑问
AndroidDaggerActivityComponent错误解决办法详解在使用dagger2的过程中,如果修改了某个类的内容,第一次编译运行时总会报错:错误
遇到的坑整个一个下午我都在解决uni-app中使用scss的坑,首先说一下我的问题,在用scss时一直不能使用@mixin,然后百度各种办法调试:代码写法问题(