Kotlin中使用Dagger2可能遇到的坑解决

 更新时间:2017年11月19日 10:33:30   作者:Stack_overflow  
在Android上创建去耦以及容易测试代码的几乎每位迟早都要诉诸Dagger,在Kotlin中设置Dagger有一些不同,所以下面这篇文章主要给大家介绍了关于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编程之光线传感器用法详解

    Android编程之光线传感器用法详解

    这篇文章主要介绍了Android编程之光线传感器用法,结合实例形式分析了Android光线传感器的功能、实现步骤与相关注意事项,并给出了相关demo示例,需要的朋友可以参考下
    2017-11-11
  • Android开发中计算器的sin、cos及tan值计算问题分析

    Android开发中计算器的sin、cos及tan值计算问题分析

    这篇文章主要介绍了Android开发中计算器的sin、cos及tan值计算问题,结合实例形式分析了Android三角函数运算中的弧度与角度计算问题与相关解决方法,需要的朋友可以参考下
    2017-11-11
  • Android通过Socket与服务器之间进行通信的示例

    Android通过Socket与服务器之间进行通信的示例

    这篇文章主要介绍了Android通过Socket与服务器之间进行通信的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Android入门之使用RecyclerView完美实现瀑布流界面详解

    Android入门之使用RecyclerView完美实现瀑布流界面详解

    网上充满着不完善的基于RecyclerView的瀑布流实现,要么根本是错的、要么就是只知其一不知其二。本文就来用RecyclerView完美实现瀑布流界面,希望大家有所帮助
    2023-02-02
  • Android WiFi热点开发的示例代码

    Android WiFi热点开发的示例代码

    这篇文章主要介绍了Android WiFi热点开发的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Android 无障碍服务 performAction 调用过程分析

    Android 无障碍服务 performAction 调用过程分析

    这篇文章主要介绍了Android 无障碍服务 performAction 调用过程分析,无障碍服务可以模拟一些用户操作,无障碍可以处理的对象,通过类 AccessibilityNodeInfo 表示,通过无障碍服务,可以通过它的performAction方法来触发一些action
    2022-06-06
  • Android如何使用正则表达式只保留字母数字

    Android如何使用正则表达式只保留字母数字

    在做项目的过程中,使用正则表达式来匹配一段文本中的特定种类字符,是比较常用的一种方式,下面这篇文章主要给大家介绍了关于Android如何使用正则表达式只保留字母数字的相关资料,需要的朋友可以参考下
    2022-05-05
  • Android碎片fragment实现静态加载的实例代码

    Android碎片fragment实现静态加载的实例代码

    这篇文章主要介绍了Android碎片fragment实现静态加载的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Android开发-之五大布局详解

    Android开发-之五大布局详解

    这篇文章主要介绍了Android开发-之五大布局详解,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Android中Property Animation属性动画编写的实例教程

    Android中Property Animation属性动画编写的实例教程

    这篇文章主要介绍了Android中Property Animation属性动画编写的实例教程,Property Animation对于动画帧的操控十分强大,需要的朋友可以参考下
    2016-04-04

最新评论