最近在使用kotlin和Dagger2来开发项目。须要在dagger2 的module返回两个相同的对象,所以使用到@Named注解。html
以下图所示java
@Provides @Named(Constants.Qualifier_HOME) fun provideHomePagerAdapter(): FragmentStatePagerAdapter { return object : AbstractPagerAdapter(fragment.childFragmentManager, arrayOf("android","ios")) { override fun getItem(pos: Int): Fragment? { //...省略 return list[pos] } } } @Provides @Named(Constants.Qualifier_COLLECT) fun provideCollectPagerAdapter(): FragmentStatePagerAdapter { return object : AbstractPagerAdapter(fragment.childFragmentManager, arrayOf("code","article")) { override fun getItem(pos: Int): Fragment? { //...省略 return list[pos] } } }复制代码
而后各自的页面里android
@FragmentScope class HomeFragment : BaseFragment<ViewPagerFragmentBinding>() { @Inject @Named("home") lateinit var adapter: FragmentStatePagerAdapter //...省略 } @FragmentScope class MyCollectFragment : BaseFragment<ViewPagerFragmentBinding>() { @Inject @Named("collect") lateinit var adapter: FragmentStatePagerAdapter //...省略 }复制代码
照理说这样是没问题的(嗯,java代码是这样)ios
可是却遇到了编译上的问题git
//... xxadapter cannot be provided without an @Provides- or @Produces-annotated method. //...复制代码
哪里不对,猜测多是@Named注解的问题,因而把@Named去掉,只保留一个provideHomePagerAdapter
方法,发现能够运行,不报错了。github
看来确实问题在这里,猜测难道是@Named
注解在kotlin上有问题markdown
Qualifier
用来替代@Named
,嗯固然仍是不行🚫难道kotlin有这么大的缺陷吗??不该该啊!难道是我代码有问题。jvm
而后建立了一个java Demo 项目,使用Dagger2进行了@Named尝试 ------> pass✅ide
6 . 因而就先放着吧,不用@Named ,先在fragment里用了by lazy 来实例化。——>pass ✅oop
如今项目开发的差很少了,回过头再来处理它了。
7 . 首先固然仍是百度,google,没答案就准备去github 的dagger2项目看看,在issue里搜了一下kotlin
没什么相关的问题,却是看到了一个问题
而后看到了这样的写法
嗯🤔好像有点不同,难道要这么写?
这个@field是什么,看过@JvmName @jvmfield 没见过这一个,那就看下文档:地址
🤔🤔🤔,试了试———>pass ✅😊
在写本文时,我又搜了下dagger2的issue,此次搜的是kotlin,而后在closed的问题里看到了
而后大神回答了这个问题
😂
原本想删了不发,可是写本文的初衷
一来是想分享一下这个问题的答案,避免有更多的人踩坑
二来想分享一下本身踩坑时解决的思路和方法(若是够运的话,第三步就应该解决了)
三来是以为多看看文档是有好处的,想来如我这样看了一下kotlin语法直接就写项目的不在少数(虽然说确实转的快),但多看看文档也许这个问题就不存在了
因此仍是继续写了。见笑了,哈