Dagger2是什么?
Dagger2是一款基于Java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试。
一、Kotlin Dagger2 配置
build.gradle
代码语言:javascript复制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
代码语言:javascript复制@Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
fun inject(app: BaseApplication)
}
AppModule
代码语言:javascript复制@Module
class AppModule(val app: Application) {
@Provides
@Singleton
fun provideApplication() = app
}
Application
代码语言:javascript复制class BaseApplication : Application() {
override fun onCreate() {
super.onCreate()
initApplication()
DaggerCoreComponent
.builder()
.coreModule(CoreModule(this))
.build();
}
}
以上配置完成,就可以愉快的在Kotlin中使用Dagger2了。
二、Kotlin使用Dagger2遇到的坑
当时我想将presenter注入到Activity中,代码如下,make Projiect的时候不通过 百思不得其解
坑1
代码语言:javascript复制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是私有的.
而我们都知道,注入的对象不可以是私有的
代码语言:javascript复制public final class MainActivity extends AppCompatActivity implements View {
@Inject
@Nullable
private Presenter mPresenter;
-----省略
}
代码语言:javascript复制//于是将上述代码改成
@Inject
@JvmField
var mPresenter : MainContract.Presenter ? = null
//或则
@Inject
lateinit mPresenter : MainContract.Presenter
即可编译成功
坑2
代码语言:javascript复制 @Inject
@JvmField
// @Named("preneter")// 错误 正确的做法如下
@field:[Named("preneter")]
var mPresenter : MainContract.Presenter ? = null
代码语言:javascript复制 @Module
inner class PresenterModules {
@Provides
@Named("preneter")
fun providePresenter(): MainContract.Presenter {
return MainPresenter(this@MainActivity)
}
@Provides
@Named("hello")
fun provide():String{
return "hello"
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ZaLou.Cn的支持。