无法将相同的实例注入服务和ViewModel

时间:2017-11-22 22:28:59

标签: android kotlin dagger-2

我试图用Dagger 2复制这个Singleton。

我想有一个BehaviorSubject,我在服务中调用onNext(),在ViewModel中调用subscribe()

这是我的Singleton对象:

object MyMessageBus {
    val pusher =  BehaviorSubject.create<String>()
}

在我的服务中,我可以这样做:

private val pusherObservable = MyMessageBus.pusher

override fun onCreate() { 
    super.onCreate()
    println("service myObservable = ${pusherObservable.hashCode()}")
}

然后在我的ViewModel中我可以这样做:

private val pusherObservable = MyMessageBus.pusher

init {
    println("viewModel myObservable = ${pusherObservable.hashCode()}")
}

当我使用它运行时,我在Service ViewModel中获得了相同的observable。

  

viewModel myObservable = 218654319

     

service myObservable = 218654319

所以我可以在服务中调用onNext并观察ViewModel中的更改。

正如我上面所说,我试图使用Dagger复制它,但我似乎无法在Service和ViewModel中获得相同的实例。我认为问题在于我只有两个不同的图形,但我无法弄清楚如何加入它们 - 即使在阅读docs并了解Subcomponents之后。

除此之外,这似乎是一个非常简单的代码。

所以我的问题是如何使用Dagger以最少的代码执行等效操作?

这是我到目前为止所尝试的内容:

这是我想要注入Service和ViewModel的类。

注意:我原本以为只是注释类和构造函数可以工作,但也尝试过使用模块(因此注释)

//@Singleton
class MessageBus {
    val pusher: BehaviorSubject<String>
//    @Inject
    constructor() {
        pusher =  BehaviorSubject.create<String>()
    }
}

以下是提供服务注入的模块

@Singleton
@Module()
abstract class AndroidModule {
    @ContributesAndroidInjector
    abstract fun contributesPusherService(): PusherService
}

这是提供MessageBus的模块(注意我也尝试使用上面注释掉的annoations。

@Module
class PervasiveModule {
    @Provides @Singleton fun provideMessageBus() = MessageBus()
}

接下来是App组件

@Singleton
@Component(modules = arrayOf(AndroidInjectionModule::class, AndroidModule::class, PervasiveModule::class))
interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(myApp: MyApp): Builder
        fun build(): AppComponent
    }
    fun inject(myApp: MyApp): MyApp
}

最后是ViewModel的组件。

@Component(modules = arrayOf(PervasiveModule::class))
@Singleton
interface MainViewModelComponent {
     @Component.Builder
     interface Builder {
          fun build(): MainViewModelComponent
     }
     fun inject(mainViewModel: MainViewModel)
}

在我的服务中:

@Inject lateinit var messageBus: MessageBus

override fun onCreate() {
    AndroidInjection.inject(this)
    super.onCreate()
    setupPusher()
    println("service created")
    println("service messageBus = ${messageBus.hashCode()}")
}

在ViewModel中我有:

@Inject lateinit var messageBus: MessageBus

init {
    DaggerMainViewModelComponent.create().inject(this)
    println("view model messageBus = ${messageBus.hashCode()}")
}

当我运行它时,一切都被注入,但我最终得到两个MessageBus实例而不是一个。

  

查看模型messageBus = 252114254

     

service messageBus = 91479273

正如我上面所说,我认为问题是MainViewModelComponentAppComponent实际上是两个不同的图表。是这样的吗?如果是这样,我如何加入他们。如果没有,有人可以解释发生了什么以及如何使其发挥作用。

0 个答案:

没有答案