【问题标题】:Singleton in Kotlin with Dagger (@Singleton) or ObjectKotlin 中的单例与 Dagger (@Singleton) 或对象
【发布时间】: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 注释类,仅在组件范围方面有意义,即一个每个组件的实例。 Kotlin object 类是真正的单例。如果您创建自己的 ViewModelFactory,您可以在其中访问 ViewModel 构造函数,这一切都可以使用 dagger 轻松完成。单例的缺点 - 测试和推理状态。
  • 实际上,我已经拥有所有用于创建 ViewModelsViewModelFactory 逻辑以及动态 SavedStateHandle (@AssistedInject.Factory) 逻辑。我只是想知道如果在我有一个 Object 类(没有依赖项)来触发一些可以在所需的 lifescopeOwner 中侦听的事件的情况下,如果注入 BaseViewModel 与静态访问相比会过度杀伤(所有子虚拟机必须@Inject)。我想知道缺点,因为对我来说,静态访问而不是构造函数注入是一个优点(当然仅在这种情况下)。

标签: android kotlin singleton dagger-2


【解决方案1】:

使用 Oject Kotlin 将简化您的生活。它更容易调用。无需创建依赖和编写额外代码。

如果您使用 Dagger,您将获得更大的灵活性。因为您可以替换代码进行测试。如果您需要将一种实现替换为另一种实现,则只需在一个地方更改代码。

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多