Kotlin下使用Dagger2出現(xiàn)的坑

當(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"
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容