我是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
}
BluetoothModule.kt
@Module
class BluetoothModule {
@Provides
@Named("rxBleClient")
@Singleton
fun provideRxBleClient(@Named("appContext") context: Context):RxBleClient =
RxBleClient.create(context)
}
BluetoothController.kt,由DaggerApplication注入。
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属性上下文尚未初始化
我错过了什么?谁能帮我吗?
谢谢。
答案 0 :(得分:1)
添加以下代码以实现此目的。
创建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)
}
}
如有任何问题,请通知我们。
答案 1 :(得分:0)
上下文对象在调用之前没有初始化
尽管我不知道,但是初始化的链接程度如何。
使用@Inject添加依赖性,执行类似的操作
@Module
class BluetoothModule(val context : Context) {
//@Inject private lateinit var context : Context
@Provides
@Named("rxBleClient")
@Singleton
fun provideRxBleClient():RxBleClient =
RxBleClient.create(context)
}
让您的通话像这样
val component = AppComponent()
component.bluetoothModule(appContext)
.//other calls here
.build()