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://www.dbjr.com.cn/article/126973.htm
二、Kotlin使用Dagger2遇到的坑
當(dāng)時我想將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)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android調(diào)用google地圖生成路線圖實現(xiàn)代碼
Android程序調(diào)用本機google地圖并且傳遞起始和終點位置生成路線圖,有需要的朋有可以參考下,或許本文對你有所幫助,好了話不多說,看代碼2013-02-02Android簡單實現(xiàn)動態(tài)權(quán)限獲取相機權(quán)限及存儲空間等多權(quán)限
這篇文章主要介紹了Android簡單實現(xiàn)動態(tài)權(quán)限獲取相機權(quán)限及存儲空間等多權(quán)限,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07