繁体   English   中英

Android MVI 使用 StateFlow 和分页 3

[英]Android MVI using StateFlow and paging 3

我正在尝试使用 state 流和分页 3 实现 android MVI 架构,但是当我看到包含分页数据的 state 时我感到困惑。

The problem is that I expose the view state from view model as a state flow object, but now inside that view state I have another flow object which comes from the paging library.

是否可以在 state 流中设置流? 如果不是我应该怎么做?

这是我的代码以进行更多说明。

任务库

override fun list(
pageNumber: Int,
pageSize: Int,
groupId: Long?,
query: String
): Flow<PagingData<Task>> {
return Pager(
    config = PagingConfig(
        pageSize = Consts.PageSize,
        maxSize = 200,
        enablePlaceholders = false
    ),
    remoteMediator = TaskRemoteMediator(query, groupId, db, taskApi),
    pagingSourceFactory = {
        TaskDataSource(taskApi, groupId, query)
    }
).flow
}

任务视图模型

viewModelScope.launch {
try {
    _taskListViewState.emit(TaskListViewState.Loading)
    val tasks = taskRepo.list(1, Consts.PageSize, intent.groupId, "")
    _taskListViewState.emit(TaskListViewState.Data(tasks))
} catch (e: Exception) {
    _taskListViewState.emit(TaskListViewState.Error(R.string.unknown_error))
}
}

任务列表视图状态

sealed class TaskListViewState {
object Idle : TaskListViewState()
object Loading : TaskListViewState()
data class Data(val tasks: Flow<PagingData<Task>>) : TaskListViewState()
data class Error(val error: Int) : TaskListViewState()
}

任务列表片段

private fun observeViewState() {

lifecycleScope.launchWhenStarted {
    viewModel.taskListViewState.collect {
        render(it)
    }
}
}

private fun render(viewState: TaskListViewState) {
Log.d(TAG, "render: $viewState")
when (viewState) {
    is TaskListViewState.Loading -> showLoading()
    is TaskListViewState.Idle -> hildeLoading()
    is TaskListViewState.Error -> {
        hildeLoading()
        showMessage(viewState.error)
    }
    is TaskListViewState.Data -> {
        hildeLoading()
        lifecycleScope.launchWhenCreated {
            viewState.tasks.collectLatest {
                tasksAdapter.submitData(lifecycle, it)
            }

        }
    }
}
}

有点晚了,但是您可以像下面这样修改类,并且不需要在 TaskListViewState 中进行流。

任务列表视图状态

sealed class TaskListViewState {
   object Idle : TaskListViewState()
   object Loading : TaskListViewState()
   data class Data(val tasks: PagingData<Task>) : TaskListViewState()
   data class Error(val error: Int) : TaskListViewState()
}

任务视图模型

viewModelScope.launch {
    try {
        _taskListViewState.emit(TaskListViewState.Loading)
        taskRepo.list(1, Consts.PageSize, intent.groupId, "")
          .cacheIn(viewModelScope)
          .collectLatest { pagingData ->
             _taskListViewState.emit(TaskListViewState.Data(pagingData))
          }
    } catch (e: Exception) {
       _taskListViewState.emit(TaskListViewState.Error(R.string.unknown_error))
    }
}

任务列表片段

private fun observeViewState() {

    lifecycleScope.launchWhenStarted {
        viewModel.taskListViewState.collect {
            render(it)
        }
    }
}

private fun render(viewState: TaskListViewState) {
    Log.d(TAG, "render: $viewState")
    when (viewState) {
        is TaskListViewState.Loading -> showLoading()
        is TaskListViewState.Idle -> hildeLoading()
        is TaskListViewState.Error -> {
            hildeLoading()
            showMessage(viewState.error)
        }
        is TaskListViewState.Data -> {
            hildeLoading()
            tasksAdapter.submitData(lifecycle, viewState.tasks)
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM