【发布时间】:2020-03-03 19:59:36
【问题描述】:
拥有一个Singleton 和几个LiveData 进行观察和发帖的最佳方法是什么?
对象:
object EventsObj {
private val _actionLiveData = MutableLiveData<...>()
val actionLiveData: LiveData<...> = _actionLiveData
fun postActionEvent(value: ...) {
_actionLiveData.postValue(value)
}
... //few more LiveDatas following the same logic
}
或匕首:
@Singleton
class EventsClass
@Inject constructor() {
private val _actionLiveData = MutableLiveData<...>()
val actionLiveData: LiveData<...> = _actionLiveData
fun postActionEvent(value: ...) {
_actionLiveData.postValue(value)
}
... //few more LiveDatas following the same logic
}
用途:
@Inject
lateinit var eventsClass: EventsClass
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
eventsClass.actionLiveData.observe(this, ...)
eventsClass.postActionEvent(...)
EventsObj.actionLiveData.observe(this, ...)
EventsObj.postActionEvent(...)
}
【问题讨论】:
-
在这种情况下,您很有可能正在寻找 EventBus 而不是 LiveData
-
正确,例如像这样:gist.github.com/takahirom/f2dbcc3053adfd87ac7e321d95a23021。但哪种方法更好,Dagger 还是 Object?在这种情况下,我一直使用 Dagger,但如果我想从 ViewModel 触发,我将不得不“到处”注入它(假设我有一些 BaseViewModel 相关的代码)。使用对象,我可以以“静态方式”发布和观察,无需注入。我想知道这种“静态用法”的缺点。
-
为了清楚起见,Dagger 中的
@Singleton与实际的单例类没有直接关系,它只是库提供的@Scope注释类,仅在组件范围方面有意义,即一个每个组件的实例。 Kotlinobject类是真正的单例。如果您创建自己的 ViewModelFactory,您可以在其中访问 ViewModel 构造函数,这一切都可以使用 dagger 轻松完成。单例的缺点 - 测试和推理状态。 -
实际上,我已经拥有所有用于创建
ViewModels的ViewModelFactory逻辑以及动态SavedStateHandle(@AssistedInject.Factory) 逻辑。我只是想知道如果在我有一个 Object 类(没有依赖项)来触发一些可以在所需的lifescopeOwner中侦听的事件的情况下,如果注入BaseViewModel与静态访问相比会过度杀伤(所有子虚拟机必须@Inject)。我想知道缺点,因为对我来说,静态访问而不是构造函数注入是一个优点(当然仅在这种情况下)。
标签: android kotlin singleton dagger-2