我在ViewModel中有两个StateFlow列表(本地和远程),它们被组合到单个uiState中,用于编写用户界面.
用户正在从远程来源提取值,这些值将保存到本地房间数据库中.我希望筛选来自远程数据源的值,以便只显示这些尚未保存到本地数据库中的值.
下面是我目前的解决方案,但它并不像我想的那样工作.
当我将实体保存到本地数据库时,它会立即显示在本地值列表中,但不会从远程列表中消失.我认为这是因为emoteFlow没有更改,所以它不会发出新值,也不会使用map
.
当用户进行刷新接口操作时,emoteFlow将发出新值,MAP将过滤结果,结果为OK.但我需要这种"第二冲动"才能让它发挥作用.
房间数据库创建的本地数据源:
private val localFlow: StateFlow<List<LocalEntity>> =
repository.local.getLocalEntity().stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000L),
initialValue = listOf()
)
远程数据源根据用户请求(点击)使用 retrofit 手动填充.
private val remoteFlow: MutableStateFlow<List<remoteEntity>> =
MutableStateFlow(listOf())
这两个列表流被合并到uiState中.我try 使用map
来实现所需的过滤.
val uiState = combine(
remoteFlow.map { remoteList ->
remoteList.filter { remote -> localFlow.value.firstOrNull { remote.id == it.id} == null }
}
.stateIn(
viewModelScope,
started = SharingStarted.WhileSubscribed(5_000L),
initialValue = listOf()
),
localFlow
) { remote, local->
JobListUiState(remote, local)
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000L),
initialValue = JobListUiState()
)
实现这一目标的正确方法是什么?在将新项目添加到本地列表时,是否可以检测远程列表中的更改?