Kotlin中使用Dagger2可能遇到的坑解决
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
@Module class 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配置的内容可以参考这里:https://www.jb51.net/article/126973.htm
二、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 //或则 @Inject lateinit 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" } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
相关文章
Android开发中计算器的sin、cos及tan值计算问题分析
这篇文章主要介绍了Android开发中计算器的sin、cos及tan值计算问题,结合实例形式分析了Android三角函数运算中的弧度与角度计算问题与相关解决方法,需要的朋友可以参考下2017-11-11Android入门之使用RecyclerView完美实现瀑布流界面详解
网上充满着不完善的基于RecyclerView的瀑布流实现,要么根本是错的、要么就是只知其一不知其二。本文就来用RecyclerView完美实现瀑布流界面,希望大家有所帮助2023-02-02Android 无障碍服务 performAction 调用过程分析
这篇文章主要介绍了Android 无障碍服务 performAction 调用过程分析,无障碍服务可以模拟一些用户操作,无障碍可以处理的对象,通过类 AccessibilityNodeInfo 表示,通过无障碍服务,可以通过它的performAction方法来触发一些action2022-06-06Android中Property Animation属性动画编写的实例教程
这篇文章主要介绍了Android中Property Animation属性动画编写的实例教程,Property Animation对于动画帧的操控十分强大,需要的朋友可以参考下2016-04-04
最新评论