android - 带有 Dagger2 的 Android Kotlin,lateinit var 尚未初始化
问题描述
我是 Dagger 新手,使用它时遇到问题。
我想要开发的是使用 RxAndroidBle 并通过 Dagger 对其进行初始化以提供上下文。
所以我研究了它是如何实现的,我写了一些代码,它似乎对我有用,但根本不起作用。
以下是我的代码。
应用组件.kt
@Singleton
@Component(modules = [
AppModule::class,
BluetoothModule::class,
AndroidInjectionModule::class])
interface AppComponent : AndroidInjector<BluetoothController> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: Application): Builder
fun build(): AppComponent
}
}
应用模块.kt
@Module
class AppModule {
@Provides
@Named("appContext")
@Singleton
fun provideContext(application: Application): Context =
application.applicationContext
}
蓝牙模块.kt
@Module
class BluetoothModule {
@Provides
@Named("rxBleClient")
@Singleton
fun provideRxBleClient(@Named("appContext") context: Context):RxBleClient =
RxBleClient.create(context)
}
用于由 DaggerApplication 注入的 BluetoothController.kt。
class BluetoothController : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().application(this).build()
}
}
我已将 android:name".BluetoothController" 插入到 AndroidManifest.xml
这就是我将如何使用它。
@field:[Inject Named("rxBleClient")]
lateinit var rxBleClient: RxBleClient
但是总是出现一个错误说:lateinit property context has not been initialized
我错过了什么?谁能帮我?
提前致谢。
解决方案
添加以下代码以实现此目的。
创建
ActivityBuilderModule
用于在活动中注入。将我们的活动视为MainActivity
@Module abstract class ActivityBuilderModule { @ContributesAndroidInjector(modules=[MainActivityModule::class]) abstract fun contributeSplashActivity(): MainActivity }
创建你的
MainActivityModule
@Module class MainActivityModule{ @Provides() fun contributeSplashActivity(mainActivity: MainActivity): MainActivity=mainActivity }
修改您的组件。
@Singleton @Component(modules = [ AppModule::class, BluetoothModule::class, ActivityBuilderModule::class, AndroidInjectionModule::class]) interface AppComponent : AndroidInjector<BluetoothController> { @Component.Builder interface Builder { @BindsInstance fun application(app: Application): Builder fun build(): AppComponent } }
在 MainActivity 中注入。
class MainActivity{ ... @Inject lateinit var rxBleClient: RxBleClient override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) } }
如果有任何问题,请告诉我们。
推荐阅读
- python - python数组中dict的key是最频繁的
- sql - SQL 查询以使用任何城市代码查找不同的城市
- doctrine - 本机查询后的学说映射
- flutter - 颤振共享使用 Riverpod 在屏幕之间接收推送数据
- python-3.x - 如何在python中将字符串转换为StringVar()
- python - 如何检查 objedc 是否具有属性 false o true
- python-3.x - 比较两个文件的每个元素(逐行)
- html - 相对于显示的内容而不是页面定位播放按钮
- pandas - 我想替换异常值而不是完全删除它...有什么建议吗?
- amazon-web-services - 每天将大量 csv 数据摄取到弹性搜索中