我是 Dagger 新手,在使用它时遇到了问题。
我想开发的是使用RxAndroidBle,通过Dagger初始化,提供Context。
所以我研究了它是如何实现的,我写了一些代码,它似乎对我有用但根本不起作用。
以下是我的代码。
AppComponent.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
}
}
AppModule.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 注入(inject)的 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
以在 Activity 中注入(inject)。将我们的 Activity 视为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 中注入(inject)。
class MainActivity{ ... @Inject lateinit var rxBleClient: RxBleClient override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) } }
如有任何问题,请告知我们。
关于带有 Dagger2 的 Android Kotlin,lateinit var 尚未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51743437/