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"
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
相关文章
使用User Agent分辨出Android设备类型的安全做法
这篇文章主要介绍了使用User Agent分辨出Android设备类型的安全做法,本文得出的结论是当你依据检测UA来判断Android手机设备,请同时检查android和mobile两个字符串,需要的朋友可以参考下2015-01-01
Android ViewPager无限循环滑动并可自动滚动完整实例
对于Android ViewPager广告页可无限循环滑动并可自动滚动带有小圆点的这个功能很多APP都有这个功能,这里为大家提供了完整的实例代码2018-03-03
Kotlin之自定义 Live Templates详解(模板代码)
这篇文章主要介绍了Kotlin之自定义 Live Templates详解(模板代码),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-03-03
Android 动态改变SeekBar进度条颜色与滑块颜色的实例代码
在上次android开发的项目中遇到个这样的需求,要动态改变seekbar进度条颜色与滑块颜色的需求,实现代码也算比较简单,对实现过程感兴趣的朋友可以通过本文学习下2016-11-11
21天学习android开发教程之SurfaceView与多线程的混搭
21天学习android开发教程之SurfaceView与多线程的混搭,感兴趣的小伙伴们可以参考一下2016-02-02


最新评论