dagger2 使用无法自动生成dagger + component 等问题集錦

一、 dagger2 使用无法自动生成dagger + component 问题

 一般两种方法进行注册:

方法一:

实体类  Product 构造方法: 

class Product @Inject constructor() {
    fun showPro(): String {
        return "shb##@@"
    }
}

桥梁 component:

@Component
interface ProductComponent {
    fun inject(mainActivity: MainActivity) {}
}

方法二:

实体类Stu:(没什么变化)

class Stu {

    val msg = "Stu 的实例是注解方式注入的"

    fun showMessage(): String {
        return msg
    }

}

module中添加@provides注解

@Module
class StuModule {

    @Singleton
    @Provides
    fun provideStu(): Stu {
        return Stu()
    }
}

桥梁component,关联module

@Singleton
@Component(modules = arrayOf(StuModule::class))
interface StuComponent {
    fun inject(activity: FirstActivity) //inject 参数就是我们需要注入开始的类
}

一般这样再进行rebuild 应该会有 dagger + xxx + component 可以进行实例注解,可是突然发现死活没法出现,折腾了半天,发现gradle 文件中少了 

apply plugin: 'kotlin-kapt'

添加后再rebuild 就可以出现了,哈哈~~就是这么简单,这么坑

二、dagger2 中rebuild 的时候编译通过,但是使用dagger + xxx + component 注册后,获取实例老是报

 Caused by: kotlin.UninitializedPropertyAccessException: lateinit property stu has not been initialized 这个错误

分析发现是component 问题,inject()方法中参数应该是需要实例化的当前活动,而不能是父类

@Singleton
@Component(modules = arrayOf(StuModule::class))
interface StuComponent {
    fun inject(activity: AppCompatActivity) //inject 参数就是我们需要注入开始的类
}

改为

@Singleton
@Component(modules = arrayOf(StuModule::class))
interface StuComponent {
    fun inject(activity: FirstActivity) //inject 参数就是我们需要注入开始的类
}

三、 com.shb.android.dagger2test.presenter.Register cannot be provided without an @Inject constructor or from an @Provides-annotated  

看到提示错误指向也是component 中的inject()方法,其实问题解决情况和二一样。

四、kotlin.NotImplementedError: An operation is not implemented: not implemented

 override fun loginFailure() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        Toast.makeText(this, "登录失败...", Toast.LENGTH_SHORT)
    }

问题就储在TODO这里,需要删除掉TODO就好了,这个TODO用处:配合IDE自动声明的TODO, 会强制开发者去实现这个TODO或者删除它。

展开阅读全文

没有更多推荐了,返回首页