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配置的内容可以参考这里:http://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"
 }
 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解Dagger2在Android开发中的新用法

    本文假设读者已经有一定Dagger2使用经验 使用疑惑 之前工作中一直在使用dagger2进行开发,用起来确实很爽,但是我从我第一次使用我就一直有一个问题或者说疑问(本人才疏学浅脑子不够使),通常情况下我们有如下清单 MyApplication,MyAppComponent,MyAppModule ActActivity,ActComponent,ActModule 简单解释下,MyAppModule提供全局单例功能,比如打印日志,ActModule提供Activity级别的功能比如发起网络请求

  • 详解Kotlin 中使用和配置 Dagger2

    前言 陆陆续续几篇文章已经讲解了项目中 Kotlin 如何配置.简单语法.DataBinding 配置,接下来就要说到 Kotlin 中的 Dagger2 了. 配置 Dagger2 项目中使用 Dagger2 ,首先还是添加依赖.同样的,因为要使用到注解处理,所以和 DataBinding 一样要添加 kapt 插件: apply plugin: 'com.android.application' ... apply plugin: 'kotlin-kapt' // kapt 插件 ... k

  • 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.

  • 解决vant中 tab栏遇到的坑 van-tabs

    话不多说,先看下问题描述: 我的需求:(和头条的tab栏类似 ,单击查看头条tab栏) 点击tab栏,下方展示出来当前tab栏下的内容列表(A页面),点击列表进入详情内容(B页面),但是返回(A页面)的时候,需要显示刚才被点击的tab栏高亮显示.(如果tab栏横向有滚动条,那也得让被选中的高亮显示). 所以,大部分人的解决办法就是将当前选中的tab的索引缓存起来,等回到该页面的时候,让被缓存的那个高亮显示出来. 坑的问题在于:van-tabs,里面的v-model默认值是0,但是类型却写着 nu

  • MySQL如何恢复单库或单表,以及可能遇到的坑

    前言: MySQL 逻辑备份工具最常用的就是 mysqldump 了,一般我们都是备份整个实例或部分业务库.不清楚你有没有做过恢复,恢复场景可能就比较多了,比如我想恢复某个库或某个表等.那么如何从全备中恢复单库或单表,这其中又有哪些隐藏的坑呢?这篇文章我们一起来看下. 1.如何恢复单库或单表 前面文章有介绍过 MySQL 的备份与恢复.可能我们每个数据库实例中都不止一个库,一般备份都是备份整个实例,但恢复需求又是多种多样的,比如说我想只恢复某个库或某张表,这个时候应该怎么操作呢? 如果你的实例数

  • 一文讲解Kotlin中的contract到底有什么用

    目录 前言 测试 查看 contract 函数 returns callsInPlace 总结 前言 我们在开发中肯定会经常用Kotlin提供的一些通用拓展函数,当我们进去看源码的时候会发现许多函数里面有contract {}包裹的代码块,那么这些代码块到底有什么作用呢?? 测试 接下来用以下两个我们常用的拓展函数作为例子 public inline fun <T, R> T.run(block: T.() -> R): R { contract { callsInPlace(block

  • Kotlin中的contract到底有什么用详解

    目录 前言 测试 总结 前言 我们在开发中肯定会经常用Kotlin提供的一些通用拓展函数,当我们进去看源码的时候会发现许多函数里面有contract {}包裹的代码块,那么这些代码块到底有什么作用呢?? 测试 接下来用以下两个我们常用的拓展函数作为例子 public inline fun <T, R> T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } ret

  • 学习Angular中作用域需要注意的坑

    Angular作用域 在用angular搭建的网页应用中,作用域(scope)这个概念是贯穿其中的.在angular的视图(view)中的很多指令是会创建一个作用域的,例如 ng-app , ng-controller 等.这个作用域就是我们在写控制器构造函数时注入的 $scope (angular1.2之前的版本),他是视图模型(view model)中的一个概念.我们的数据模型(model)就是定义在作用域中的. Angular作用域的坑 用过angular的人应该都会经过一个过程,就是刚开

  • Kotlin中协变、逆变和不变示例详解

    前言 Kotlin 泛型的基本语法类似于 Java ,不过出于型变安全,不支持 Java 中的<? extends T>,<?super T> 通配符型变约束,而是采用类似 C# 的 in,out 用于支持协变和逆变,这同时避免了处理子类型化,父类化的问题(即Java泛型中典型的List<T> 不是 List<Object>的子类型的问题): 基本的泛型语法可以参考官方中文文档:https://www.kotlincn.net/docs/reference/

  • Kotlin中Suppress的非常规用法示例

    前言 在 Java 中,有个叫 SuppressWarnings 的注解,用于忽略特定的编译器警告.Kotlin 中也有一个类似功能的注解,叫做 Suppress,本文主要讲讲这个注解有什么用. 常规用法 有时候会写出这样的一些代码.这些在Kotlin编译器的眼里可能出现问题的代码,实际上却非常正确,跑起来不会出任何问题. 然后你就得到了一个编译器警告(warning),甚至是编译错误(error). 比较常见的,比如说 unchecked cast: val some: List<*> =

  • Kotlin中的反射机制深入讲解

    前言 Java中的反射机制,使得我们可以在运行期获取Java类的字节码文件中的构造函数,成员变量,成员函数等信息.这一特性使得反射机制被常常用在框架中,想要比较系统的了解Kotlin中的反射,先从Java的反射说起. Java中的反射 通常我们写好的.java源码文件,经过javac的编译,最终生成了.class字节码文件.这些字节码文件是与平台无关的,使用时通过Classloader去加载这些.class字节码文件,从而让程序按照我们编写好的业务逻辑运行.Java的反射主要是从这些.class

随机推荐