美文网首页Android葵花宝典kotlin程序员
在kotlin中使用dagger2遇到的一个问题

在kotlin中使用dagger2遇到的一个问题

作者: ditclear | 来源:发表于2017-10-28 22:16 被阅读651次

写在前面

最近在使用kotlin和Dagger2来开发项目。需要在dagger2 的module返回两个相同的对象,因此使用到@Named注解。

如下图所示

    @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]
            }
        }
    }

然后各自的页面里

@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代码是这样)

但是却遇到了编译上的问题

image.png

然后看控制台输出的error

//...
xxadapter cannot be provided without an @Provides- or @Produces-annotated method.
//...  

猜想

哪里不对,猜想可能是@Named注解的问题,于是把@Named去掉,只保留一个provideHomePagerAdapter方法,发现可以运行,不报错了。

解决

看来确实问题在这里,猜想难道是@Named注解在kotlin上有问题

  1. 尝试去自定义了一个Qualifier用来替代@Named,嗯当然还是不行🚫
  2. 然后想想网上是不是有会遇到同样问题的额,结果大多数都在讲dagger2集成使用说明什么的,都是些常规的用法。🚫
  3. 搜了下Stack Overflow 没有找到,然后在dagger2的issue里搜了下@Named,没找到😎(盲人)🚫
  4. 在kotlin交流群里问了,零星的几个人回答,没效果就没声音了。还是要靠自己。🚫
  5. 于是在github上查看了许多使用Dagger2和kotlin开发的项目,结果都是比较常规的用法,或者各自页面有自己的component和module,写成@Named注解的还没看到。

难道kotlin有这么大的缺陷吗??不应该啊!难道是我代码有问题。

然后创建了一个java Demo 项目,使用Dagger2进行了@Named尝试 ------> pass✅

6 . 于是就先放着吧,不用@Named ,先在fragment里用了by lazy 来实例化。——>pass ✅

现在项目开发的差不多了,回过头再来处理它了。

7 . 首先当然还是百度,google,没答案就准备去github 的dagger2项目看看,在issue里搜了一下kotlin

没什么相关的问题,倒是看到了一个问题


然后看到了这样的写法

嗯🤔好像有点不一样,难道要这么写?
这个@field是什么,看过@JvmName @jvmfield 没见过这一个,那就看下文档:地址

🤔🤔🤔,试了试———>pass ✅😊

结语

在写本文时,我又搜了下dagger2的issue,这次搜的是kotlin,然后在closed的问题里看到了


然后大神回答了这个问题


😂
本来想删了不发,但是写本文的初衷

一来是想分享一下这个问题的答案,避免有更多的人踩坑

二来想分享一下自己踩坑时解决的思路和方法(如果够运的话,第三步就应该解决了)

三来是觉得多看看文档是有好处的,想来如我这样看了一下kotlin语法直接就写项目的不在少数(虽说确实转的快),但多看看文档也许这个问题就不存在了

所以还是继续写了。见笑了,哈

相关文章

  • Kotlin使用Dagger2问题

    在kotlin中使用Dagger2 的时候,可能出现dagger2代码不能编译的问题导致此问题的原因可能如下 如果...

  • kotlin [Dagger/MissingBinding] x

    在项目转kotlin的时候,使用dagger2遇到了上述问题。排查了一周,才把所有问题解决。在此做一个踩坑实践的记...

  • Kotlin开发遇到问题汇总

    1. dagger2的@Named,无法使用 在Kotlin使用Dagger2的时候,因为用@Module标注的类...

  • 在kotlin中使用dagger2遇到的一个问题

    写在前面 最近在使用kotlin和Dagger2来开发项目。需要在dagger2 的module返回两个相同的对象...

  • Kotlin在webview中遇到的问题

    在使用Kotlin时,重写WebView的WebViewClient在运行时onPageStarted()会发生奔...

  • Kotlin ATTENTION : Kotlin interf

    最近尝试使用Kotlin编写Android App,在将Java文件转换成Kotlin时遇到了这个问题:在Kotl...

  • 使用kotlin遇到的问题

    这是在项目中使用kotlin开发遇见的问题 1 Unresolved reference: java 在项目的gr...

  • Kotlin| 实践

    本文用于记录我在使用 Kotlin 中遇到的问题,有注意事项,也有与 java 的比较,比较零散,持续更新,遇到问...

  • Kotlin中遇到的问题

    介绍 这里记录一下使用Kotlin中遇到的一些问题。 Lambda问题 我们在开发App的时候经常会使用观察者模式...

  • 在kotlin-MVP使用dagger2(v2.11+)

    这个一个简单的例子;介绍如何在Kotlin-MVP中使用dagger2(v2.11+),基本使用就不介绍了,还是跟...

网友评论

本文标题:在kotlin中使用dagger2遇到的一个问题

本文链接:https://www.haomeiwen.com/subject/apzspxtx.html