android - Dagger 未初始化 var

标签 android kotlin dagger-2

我在使用 Kotlin 的 Android 项目中启动 Dagger 时遇到问题。

这个结构是下一个

Dagger 包含在客户端应用程序调用的 Android 模块中

魔术盒.kt

interface MagicBox {
   fun getDate(): Long?
}

MagicBoxImpl.kt

class MagicBoxImpl (): MagicBox{

    var date: Long = Date().time

    override fun getDate(): Long {
        return date
    }
}

主模块.kt

@Module
class MainModule (private val app: Application) {

    @Provides
    @Singleton
    fun provideMagicBox(): MagicBox {
       return MagicBoxImpl()
    }
}

主要组件.kt

@Singleton
@Component(modules = [MainModule::class, PresenterModule::class])
interface MainComponent{
    fun inject(target: Activity)
}

应用程序.kt

class Application: Application() {

    lateinit var mainComponent: MainComponent

    override fun onCreate() {
        super.onCreate()

        mainComponent = initDagger(this)
    }

    private fun initDagger(app: Application): MainComponent =
        DaggerMainComponent.builder()
            .mainModule(MainModule(app))
            .build()

}

主要 Activity .kt

 @Inject
    lateinit var magicBox: MagicBox

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.main_layout)
        (application as ClientSdk).mainComponent.inject(this)

        tvDaggerTest = findViewById(R.id.tvDaggerTest)

        tvDaggerTest!!.text = magicBox.getDate().toString()
}

得到如下错误

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property magicBox has not been initialized

最佳答案

fun inject(target: Activity) 应该是 fun inject(target: MainActivity)


同样为了更好地使用 Dagger,以下内容应该是:

@Module
abstract class MainModule {
    @Binds
    abstract fun magicBox(impl: MagicBoxImpl): MagicBox
}

@Singleton class MagicBoxImpl @Inject constructor(): MagicBox {

关于android - Dagger 未初始化 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57040168/

相关文章:

android - Dagger 2 和 ViewModel 自定义范围

android - 如何隐藏 WebView 错误页面。可能吗?

Kotlin 无符号字节与 javascript Uint8ClampedArray

android - 任务 ':app:kaptDebugKotlin' 的 Kotlin 执行失败

AndroidX Dagger2 MultiDexApplication : Does not implement HasActivityInjector

android - Dagger 2 和 Multidex 应用程序

java - 当列表不为空时,ListFragment 显示空文本

Android 即时应用程序 - 不能 "Run unverified software, run arbitrary native code"。仅即时应用程序运行时

android - NFC 设备所有者配置和 Knox

Kotlin:当 Java 库同时具有原始类型和盒装类型的重载时,我该怎么办?