一、 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或者删除它。