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

时间:2018-08-08 09:41:12

标签: android kotlin dagger

我是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属性上下文尚未初始化

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

谢谢。

2 个答案:

答案 0 :(得分:1)

添加以下代码以实现此目的。

  1. 创建ActivityBuilderModule以便在活动中进行注入。将我们的活动视为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中注入。

    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()