中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-23 18:08:22 來源:腳本之家 閱讀:438 作者:Stack_overflow 欄目:移動開發

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 關于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了。

更多關于Kotlin Dagger2配置的內容可以參考這里:https://www.jb51.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 代碼 轉成字節碼后再轉成java代碼,發現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"
 }
 }

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡东县| 东兴市| 抚松县| 秦皇岛市| 沙洋县| 陆河县| 孟津县| 泰州市| 巴林右旗| 寻甸| 祁东县| 罗城| 桂东县| 正定县| 理塘县| 门头沟区| 博爱县| 马公市| 惠安县| 砚山县| 岫岩| 阿合奇县| 徐州市| 江门市| 南昌县| 吉首市| 泰宁县| 鄂托克旗| 郎溪县| 宣城市| 通辽市| 榆林市| 彭阳县| 渝中区| 安宁市| 醴陵市| 襄垣县| 民勤县| 永顺县| 鄂尔多斯市| 沧源|