国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Kotlin中使用Dagger2可能遇到的坑解決

2024-07-21 23:03:40
字體:
供稿:網(wǎng)友

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

@Moduleclass 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了。

二、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//或則@Injectlateinit 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í)價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到kotlin教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 贡觉县| 宝清县| 黄大仙区| 麻阳| 惠安县| 崇礼县| 珠海市| 西丰县| 临湘市| 信阳市| 丰顺县| 崇阳县| 铅山县| 湖北省| 乌拉特后旗| 政和县| 宁海县| 钟祥市| 隆尧县| 城步| 石渠县| 哈密市| 保靖县| 商城县| 建始县| 江陵县| 义马市| 渭南市| 色达县| 鄄城县| 东阿县| 双牌县| 塔河县| 蚌埠市| 乌审旗| 芒康县| 会泽县| 永州市| 中江县| 札达县| 滦南县|