Kotlin中使用Dagger2可能遇到的坑解決
Dagger2是什么?
Dagger2是一款基于Java注解,在編譯階段完成依賴注入的開源庫,主要用于模塊間解耦,方便進(jìn)行測試。
一、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.dbjr.com.cn/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)文章
Android調(diào)用google地圖生成路線圖實(shí)現(xiàn)代碼
Android程序調(diào)用本機(jī)google地圖并且傳遞起始和終點(diǎn)位置生成路線圖,有需要的朋有可以參考下,或許本文對(duì)你有所幫助,好了話不多說,看代碼2013-02-02
android手機(jī)端與PC端使用adb forword通信
這篇文章主要介紹了android手機(jī)端與PC端使用adb forword通信的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android自定義View實(shí)現(xiàn)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)驗(yàn)證碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android自定義View實(shí)現(xiàn)拼圖小游戲
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Android簡單實(shí)現(xiàn)動(dòng)態(tài)權(quán)限獲取相機(jī)權(quán)限及存儲(chǔ)空間等多權(quán)限
這篇文章主要介紹了Android簡單實(shí)現(xiàn)動(dòng)態(tài)權(quán)限獲取相機(jī)權(quán)限及存儲(chǔ)空間等多權(quán)限,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07

