Android 将pagingData 3流与另一个流相结合
我有一个pagingData flow对象,我想将其与不同的融合位置流相结合,以便对pagingData列表的每个项目进行相应的处理Android 将pagingData 3流与另一个流相结合,android,kotlin,kotlin-coroutines,flow,android-paging,Android,Kotlin,Kotlin Coroutines,Flow,Android Paging,我有一个pagingData flow对象,我想将其与不同的融合位置流相结合,以便对pagingData列表的每个项目进行相应的处理 val point : Flow<Point> val pagingDate : Flow<PagingData> val点:流 val pagingDate:流量 我尝试使用combine和combineTransform,但它似乎不起作用,因为当更新应用程序崩溃并显示与pagingData 3相关的错误消息时,无法发出两次 jav
val point : Flow<Point>
val pagingDate : Flow<PagingData>
val点:流
val pagingDate:流量
我尝试使用combine和combineTransform,但它似乎不起作用,因为当更新应用程序崩溃并显示与pagingData 3相关的错误消息时,无法发出两次
java.lang.IllegalStateException:尝试从
pageEventFlow,这是一个非法操作。你忘了打电话了吗
Flow.cachedIn(协同视野)
我在这里有哪些选项可以使用流数据转换分页数据项?请继续,因为其他人可能会遇到此问题,尽管OP尚未更新他们的答案
这通常是由于使用了
.combine
或类似的运算符,这些运算符将重复流中最新发出的值,从而导致同一实例被使用两次。为了防止出现这种情况,您可以在.combine()
之前调用.cachedIn(scope)
,以便流是多播的,从而为您提供一个预加载缓存数据的分页数据的新实例。您可以分享.combine和整个操作符链对流的用法吗?非常感谢!对于那些好奇的人来说,两次调用cachedIn(scope)
似乎也是可以接受的。因此,这段代码工作得非常好:-pagedFlow=repository.getPagedData().cachedIn(scope).combine(otherFlow){//Your UI transformations here}.cachedIn(scope)
如果您的转换很简单,您可能需要注意正在缓冲的项的数量,或者至少创建一个较小的范围来缓存它们,而不是viewModelScope。。。根据您期望触发的次数,.combine()
是的,我为此尝试了不同的解决方案,但不幸的是,我的转换并不简单(转换为UI模型并添加分隔符)。.combine()
中使用的另一个流在分页期间不会更改,它只能在用户修改应用程序其他部分的条目时更改。因此,combine()。不过,我会看看是否可以尝试使用其他缓存范围。另外,对于应用程序性能,我注意到在转换后调用cachedIn()
会产生显著的积极影响。加载的项目相对较轻(基本数据类,无图像),但项目数量可能非常大。