【问题标题】:Coroutines and ViewModel best practice for separation of concers用于分离关注点的协程和视图模型最佳实践
【发布时间】:2021-11-14 12:57:00
【问题描述】:

我需要一些指导,才能在我的 ViewModel 类中以实时数据的形式观察一些流。

例如:ViewModel 类的字段 userDataFlow 下面结合了一些数据流流。我希望能够将该字段的工作提取到一个单独的类中,并让所有内部工作都在那里进行,并且只想观察 ViewModel 中字段的 LiveData。我需要从 ViewModel 的该类的 Parameter 中传递一些东西,Flow 需要这些东西才能工作。不确定这是否是一个好习惯。基本上,让我的 ViewModel 观察结果并将其传递给 View。

   val userDataFlow: Flow<List<UserData>> = 
   combine(
       familyChannel.asFlow(),
       userRealTimeData.asFlow,  
       ).asLiveData()
}

【问题讨论】:

  • 这段代码没有意义。它是流还是 LiveData?您获取 combine 返回的 Flow 并将其转换为 LiveData 只是为了尝试使用它初始化 Flow 属性。我不明白你对你想要做什么的描述。
  • 您的问题不是很清楚。但是,当您谈论关注点分离时,我会添加一个存储库层来处理业务逻辑,而不是让 ViewModel 处理它。让 ViewModel 只为视图准备数据。看看这个:developer.android.com/jetpack/guide

标签: android kotlin concurrency kotlin-coroutines


【解决方案1】:

听起来您需要一个UseCase/Interactor,简而言之,它会处理来自不同存储库的数据。

例如,假设您想要一份居住在 COVID-19 感染率高于特定值的国家/地区的朋友列表:

class GetFriendsInDangerUseCase(
    private val friendsRepository: FriendsRepository,
    private val countryRepository: CountryRepository)

    fun invoke(threshold: Float) = friendsRepository.friendsFlow
        .combine(countryRepository.countriesFlow) { friends, countries ->
            val dangerousCountries = countries.filter { it.infectionRate >= threshold }
            friends.filter { it.country in dangerousCountries }
        }

然后在您的虚拟机中像这样使用它:

val friendsInDangerFlow = getFriendsInDanger(0.5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多