Kotlin中使用Dagger2可能遇到的坑解決
Dagger2是什么?
Dagger2是一款基于Java注解,在編譯階段完成依賴注入的開源庫,主要用于模塊間解耦,方便進(jìn)行測(cè)試。
一、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 一個(gè)dagger2 關(guān)于Android的增強(qiáng)庫 可選項(xiàng)
compile rootProject.ext.dependencies["dagger-android"]
//可選項(xiàng)
compile rootProject.ext.dependencies["dagger-android-support"]
//可選項(xiàng)
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了。
更多關(guān)于Kotlin Dagger2配置的內(nèi)容可以參考這里:http://www.dhdzp.com/article/126973.htm
二、Kotlin使用Dagger2遇到的坑
當(dāng)時(shí)我想將presenter注入到Activity中,代碼如下,make Projiect的時(shí)候不通過 百思不得其解
坑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 代碼 轉(zhuǎn)成字節(jié)碼后再轉(zhuǎn)成java代碼,發(fā)現(xiàn)Presenter是私有的.
而我們都知道,注入的對(duì)象不可以是私有的
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")// 錯(cuò)誤 正確的做法如下
@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"
}
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
使用User Agent分辨出Android設(shè)備類型的安全做法
這篇文章主要介紹了使用User Agent分辨出Android設(shè)備類型的安全做法,本文得出的結(jié)論是當(dāng)你依據(jù)檢測(cè)UA來判斷Android手機(jī)設(shè)備,請(qǐng)同時(shí)檢查android和mobile兩個(gè)字符串,需要的朋友可以參考下2015-01-01
Android ViewPager無限循環(huán)滑動(dòng)并可自動(dòng)滾動(dòng)完整實(shí)例
對(duì)于Android ViewPager廣告頁可無限循環(huán)滑動(dòng)并可自動(dòng)滾動(dòng)帶有小圓點(diǎn)的這個(gè)功能很多APP都有這個(gè)功能,這里為大家提供了完整的實(shí)例代碼2018-03-03
Android音頻開發(fā)之錄制音頻(WAV及MP3格式)
這篇文章主要為大家介紹了Android如何實(shí)現(xiàn)音頻文件的錄制(WAV及MP3格式),文中代碼具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Kotlin之自定義 Live Templates詳解(模板代碼)
這篇文章主要介紹了Kotlin之自定義 Live Templates詳解(模板代碼),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android 動(dòng)態(tài)改變SeekBar進(jìn)度條顏色與滑塊顏色的實(shí)例代碼
在上次android開發(fā)的項(xiàng)目中遇到個(gè)這樣的需求,要?jiǎng)討B(tài)改變seekbar進(jìn)度條顏色與滑塊顏色的需求,實(shí)現(xiàn)代碼也算比較簡單,對(duì)實(shí)現(xiàn)過程感興趣的朋友可以通過本文學(xué)習(xí)下2016-11-11
21天學(xué)習(xí)android開發(fā)教程之SurfaceView與多線程的混搭
21天學(xué)習(xí)android開發(fā)教程之SurfaceView與多線程的混搭,感興趣的小伙伴們可以參考一下2016-02-02
Android Socket實(shí)現(xiàn)多個(gè)客戶端即時(shí)通信聊天
這篇文章主要為大家詳細(xì)介紹了Android Socket實(shí)現(xiàn)多個(gè)客戶端即時(shí)通信聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

