我是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
}
蓝牙模块
@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属性上下文尚未初始化
我错过了什么?谁能帮我?
提前致谢。
添加以下代码以实现此目的。
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)
}
}
如有任何问题,请通知我们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句