亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2017年11月19日 10:33:30   作者:Stack_overflow  
在Android上創(chuàng)建去耦以及容易測(cè)試代碼的幾乎每位遲早都要訴諸Dagger,在Kotlin中設(shè)置Dagger有一些不同,所以下面這篇文章主要給大家介紹了關(guān)于Kotlin中使用Dagger2可能遇到的坑的解決方法,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

Dagger2是什么?

Dagger2是一款基于Java注解,在編譯階段完成依賴注入的開(kāi)源庫(kù),主要用于模塊間解耦,方便進(jìn)行測(cè)試。

一、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)庫(kù) 可選項(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://chabaoo.cn/article/126973.htm

二、Kotlin使用Dagger2遇到的坑

當(dāng)時(shí)我想將presenter注入到Activity中,代碼如下,make Projiect的時(shí)候不通過(guò) 百思不得其解

坑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é)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論