gpt4 book ai didi

带有 Dagger2 的 Android Kotlin,lateinit var 尚未初始化

转载 作者:太空狗 更新时间:2023-10-29 13:03:41 26 4
gpt4 key购买 nike

我是 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

我错过了什么?谁能帮帮我?

提前致谢。

最佳答案

添加下面的代码来实现这一点。

  1. 创建 ActivityBuilderModule 以在 Activity 中注入(inject)。将我们的 Activity 视为 MainActivity

    @Module
    abstract class ActivityBuilderModule {
    @ContributesAndroidInjector(modules=[MainActivityModule::class])
    abstract fun contributeSplashActivity(): MainActivity
    }
  2. 创建您的 MainActivityModule

    @Module
    class MainActivityModule{
    @Provides()
    fun contributeSplashActivity(mainActivity: MainActivity):
    MainActivity=mainActivity
    }
  3. 修改您的组件。

    @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
    }
    }
  4. 在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com