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 關(guān)于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了。
更多關(guān)于Kotlin Dagger2配置的內(nèi)容可以參考這里:http://m.fzitv.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 代碼 轉(zhuǎn)成字節(jié)碼后再轉(zhuǎn)成java代碼,發(fā)現(xiàn)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"
}
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
使用User Agent分辨出Android設(shè)備類型的安全做法
這篇文章主要介紹了使用User Agent分辨出Android設(shè)備類型的安全做法,本文得出的結(jié)論是當你依據(jù)檢測UA來判斷Android手機設(shè)備,請同時檢查android和mobile兩個字符串,需要的朋友可以參考下2015-01-01
Android ViewPager無限循環(huán)滑動并可自動滾動完整實例
對于Android ViewPager廣告頁可無限循環(huán)滑動并可自動滾動帶有小圓點的這個功能很多APP都有這個功能,這里為大家提供了完整的實例代碼2018-03-03
Android音頻開發(fā)之錄制音頻(WAV及MP3格式)
這篇文章主要為大家介紹了Android如何實現(xiàn)音頻文件的錄制(WAV及MP3格式),文中代碼具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
Kotlin之自定義 Live Templates詳解(模板代碼)
這篇文章主要介紹了Kotlin之自定義 Live Templates詳解(模板代碼),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android 動態(tài)改變SeekBar進度條顏色與滑塊顏色的實例代碼
在上次android開發(fā)的項目中遇到個這樣的需求,要動態(tài)改變seekbar進度條顏色與滑塊顏色的需求,實現(xiàn)代碼也算比較簡單,對實現(xiàn)過程感興趣的朋友可以通過本文學習下2016-11-11
21天學習android開發(fā)教程之SurfaceView與多線程的混搭
21天學習android開發(fā)教程之SurfaceView與多線程的混搭,感興趣的小伙伴們可以參考一下2016-02-02
Android Socket實現(xiàn)多個客戶端即時通信聊天
這篇文章主要為大家詳細介紹了Android Socket實現(xiàn)多個客戶端即時通信聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

