【问题标题】:Kotlin Dagger Module not setKotlin Dagger 模块未设置
【发布时间】:2018-05-11 02:51:29
【问题描述】:

刚接触 kotlin,正在尝试迁移一个用 Java 编写的小型 Android 项目。不知道如何处理这个错误:

原因:java.lang.IllegalStateException:
com.mydomain.example.dagger.BusModule 必须设置
> com.mydomain.example.dagger.DaggerAppComponent$Builder.build(DaggerAppComponent.java:87)
> 在 com.mydomain.example.MyApplication.buildComponent(MyApplication.kt:29)
> 在 com.mydomain.example.MyApplication.onCreate(MyApplication.kt:17)
> 在 android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1118)
>在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:5791)

这是BusModule 类:

@Module
object BusModule {

    const val PROVIDER_FRAGMENT_SELECTION = "fragment_selection"

    @Provides
    @Singleton
    @Named(PROVIDER_FRAGMENT_SELECTION)
    fun provideNewFragmentSelection(): PublishSubject<String> {
        return PublishSubject.create()
    }
}

这里是 AppComponent 类:

@Component(modules = [(AppModule::class), (DataModule::class), (BusModule::class)])
@Singleton
interface AppComponent {

    @get:Named(BusModule.PROVIDER_FRAGMENT_SELECTION)
    val selectedFragmentName: PublishSubject<String>

    fun inject(mainActivity: MainActivity)
}

最后是应用程序类:

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        appComponent = buildComponent()
    }

    private fun buildComponent(): AppComponent {
        return DaggerAppComponent.builder().build()
    }

    companion object {

        var appComponent: AppComponent? = null
            private set
    }
}

无法弄清楚错误消息的含义。 BusModule 怎么没有“设置”?谢谢!

【问题讨论】:

    标签: android kotlin dagger-2


    【解决方案1】:

    BusModule 应该是一个类而不是一个对象,const val PROVIDER_FRAGMENT_SELECTION 应该移动到该类的companion object。于是模块就变成了:

    @Module
    class BusModule {
        companion object {
            const val PROVIDER_FRAGMENT_SELECTION = "fragment_selection"
        }
        @Provides
        @Singleton
        @Named(PROVIDER_FRAGMENT_SELECTION)
        fun provideNewFragmentSelection(): PublishSubject<String> {
            return PublishSubject.create()
        }
    }
    

    【讨论】:

    • 这样做的问题是我丢失了我的事件总线,这是该模块的重点。一旦我把它变成一个类,我需要注释掉const val ...,我的事件总线不再工作。
    • @Alex 你说的事件总线是什么意思?如果您在谈论库,您可以稍微重构您的代码。就const val 而言,您可以将其移至模块类中的companion object
    • 伴随对象是最后一块。谢谢!
    • 欢迎您!我想我应该把它包括在答案中。
    【解决方案2】:

    我认为您所要做的就是添加一个@JvmStatic 注释。

    @Module
    object BusModule {
        @Provides
        @Singleton
        @Named(PROVIDER_FRAGMENT_SELECTION)
        @JvmStatic
        fun provideNewFragmentSelection(): PublishSubject<String> {
            return PublishSubject.create()
        }
    

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2017-10-20
      相关资源
      最近更新 更多