首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Kotlin流的组合结果用于来自多个usecases/interactors的视图模型中?

如何将Kotlin流的组合结果用于来自多个usecases/interactors的视图模型中?
EN

Stack Overflow用户
提问于 2020-04-10 09:25:03
回答 1查看 2.9K关注 0票数 4

背景

我正在尝试用存储库和用例/交互器来实现MVVM风格的干净架构模式。我想使用Kotlin流作为usecases/interactors。所有的用例都有相同的设置,结果被封装在一个密封的类中。

响应包装器:

代码语言:javascript
复制
sealed class Response<out T> {
    object Loading : Response<Nothing>()
    data class Success<T>(val data: T? = null) : Response<T>()
    data class Error(val error: ErrorEntity? = null) : Response<Nothing>()
    data class Empty(val msg: Int = R.string.empty_string) : Response<Nothing>()
}

所有的用例/交互器实现:

代码语言:javascript
复制
interface UseCase<T, Params> {
    fun execute(params: Params? = null) : Flow<Response<T>>
}

问题

在我的示例中,我需要在GetFbUserUseCase的结果中使用类GetAllUsersUseCase的结果。它们都发出一个加载、错误和结果状态,我想直接委托给UI。

示例代码

代码语言:javascript
复制
class TaskEditViewModel(
    private val getCurrentFbUserUseCase: GetFbUserUseCase,
    private val getAllUsersUseCase: GetAllUsersUseCase
) : ViewModel() {

private val _pageState = MutableLiveData<Response<*>>()
val pageState: LiveData<Response<*>>
    get() = _pageState

fun getUsers() {
    viewModelScope.launch {

        // get current user ID from GetFbUserUseCase.
        val firebaseUser: Flow<Response<FirebaseUser?>> = getCurrentFbUserUseCase.execute()
        // get all users from GetAllUsersUseCase. 
        val userList: Flow<Response<List<User>>> = getAllUsersUseCase.execute()

        // somehow combine both results??
        merge(firebaseUser, userList).collect { response ->

            // delegate the combined Loading, Error states to the UI ?
            _pageState.value = response

            // only handle the Success state in the viewmodel? 
            when (response) {
                is Response.Success<*> -> {
                    // get current user ID from GetFbUserUseCase

                    // apply filtering on the result of `GetAllUsersUseCase` with the result
                    // from `GetFbUserUseCase` and show different UI accordingly
                    if (response.data.filterNot { it.userId == currentUser.userId }.isEmpty()) {
                        // notify liveData to show current user
                    } else {
                        // notify liveData to show complete user list
                    }
                }
            }
        }
    }
}

问题:

根据:Kotlin流,有多个选项可以组合和扁平多个流。哪一个最适合我的问题,我将如何实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2020-05-14 22:21:20

我看到合并解决了你的问题。

下面是如何将这两个流组合在一起

代码语言:javascript
复制
firebaseUser.combine(userList).collect { fbuser, userlist -> 
  //combine the results and set the livedata here
  someFunThatSetsLiveData(fbuser, userlist)
}    

每当其中一个流发出新结果时,就会调用someFunThatSetsLiveData。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61137397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档