最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Kotlin中使用Dagger2可能遇到的坑解决
时间:2022-06-25 23:11:37 编辑:袖梨 来源:一聚教程网
Dagger2是什么?
Dagger2是一款基于Java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试。
一、Kotlin Dagger2 配置
build.gradle
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
...
dependencies {
...
//dagger2
compile rootProject.ext.dependencies["dagger"]
kapt rootProject.ext.apt["dagger-compiler"]
//dagger2 android 一个dagger2 关于Android的增强库 可选项
compile rootProject.ext.dependencies["dagger-android"]
//可选项
compile rootProject.ext.dependencies["dagger-android-support"]
//可选项
kapt rootProject.ext.apt["dagger-android-processor"]
}
AppComponent
@Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
fun inject(app: BaseApplication)
}
AppModule
@Module
class AppModule(val app: Application) {
@Provides
@Singleton
fun provideApplication() = app
}
Application
class BaseApplication : Application() {
override fun onCreate() {
super.onCreate()
initApplication()
DaggerCoreComponent
.builder()
.coreModule(CoreModule(this))
.build();
}
}
以上配置完成,就可以愉快的在Kotlin中使用Dagger2了。
更多关于Kotlin Dagger2配置的内容可以参考这里:
二、Kotlin使用Dagger2遇到的坑
当时我想将presenter注入到Activity中,代码如下,make Projiect的时候不通过 百思不得其解
坑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 代码 转成字节码后再转成java代码,发现Presenter是私有的.
而我们都知道,注入的对象不可以是私有的
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")// 错误 正确的做法如下
@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"
}
}
相关文章
- 天国拯救2可攻略女性角色介绍说明 10-28
- 天国拯救2米兰套装获取方法攻略分享 10-28
- 天国拯救2炼金蒸馏操作方法介绍说明 10-28
- 燕云十六声周一舟聊天对话攻略分享 10-28
- 燕云十六声裴猫儿聊天对话攻略分享 10-28
- 燕云十六声万事知长生鹿仙人任务攻略 10-28