在使用Kotlin Flow与LiveData时,onCompletion未被调用

3

以下是我在使用Flow时的尝试。我在onStart中展示了一个ProgressBar,并试图在onCompletion中隐藏它。

在ViewModel类中,appDatabase.eventDao().getAllEvents()返回的是Flow<List<EntityEvents>

@ExperimentalCoroutinesApi
val allEvents: LiveData<Outcome<List<Event>>> = _fetchEvents.switchMap { _ ->
    appDatabase.eventDao().getAllEvents()
        .map { eventListMapper.map(it) }
        .map { sortEventsBasedOnPreference(it) }
        .flowOn(Dispatchers.IO)
        .map { Outcome.success(it) }
        .onStart { emitLoading(true) }
        .onCompletion { emitLoading(false) }
        .catch { emitFailure(it, R.string.err_something_wrong) }
        .asLiveData(context = viewModelScope.coroutineContext)
}

一切都正常,但我无法弄清楚为什么当任务完成时onCompletion没有被调用?


你不需要调用终端操作符来完成流程吗?或者当它没有项目时,它会自动终止吗?“流上的终端操作符可以是挂起函数,如collect、single、reduce、toList等,也可以是launchIn操作符,在给定范围内启动流的收集。” - Vesper
1
它会自动终止并将数据加载到UI中,但是当flow完成时,onCompletion不应该被调用吗?我的目标是在onStartonCompletion操作符中分别显示和隐藏ProgressBar - Hussain
我经历了同样的问题,你最终是怎么处理它的? - joghm
我曾经遇到过同样的问题,但后来发现发射部分从未完成,因此 onCompletion 从未被调用。请检查您的流程是否已完成。 - Hooni
@Hussain,你是如何解决进度条问题的?我也遇到了同样的问题。 - DennisVA
1个回答

1

如果appDatabase.eventDao().getAllEvents()基于Flow实现,那么永远不要调用onCompletion()

为什么?

因为getAllXXX()查询是“热”的。 实际上,查询并没有完成。只有数据被发出。

当数据发生变化时,查询将再次发出数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接