我试图用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
正如我上面所说,我认为问题是MainViewModelComponent
和AppComponent
实际上是两个不同的图表。是这样的吗?如果是这样,我如何加入他们。如果没有,有人可以解释发生了什么以及如何使其发挥作用。