android adapter.submitData 后的第 3 行分页未执行

android paging 3 line after adapter.submitData doesn't get executed

我目前正在学习 Paging 3 库。我有一个应用程序,它有微光占位符用于在加载数据时显示。当我获得数据时,我想隐藏微光布局并显示回收器视图。

lifecycleScope.launch {
            quoteViewModel.getQuotes2().collectLatest {
                binding.shimmerLayout.visibility = View.GONE // this line gets executed when view created and it causes shimmer layout to hide
                binding.homeRecyclerView.visibility = View.VISIBLE
                homeAdapter.submitData(it)
                Log.d("mytag", "after submit data") // this line isn't executed
            }
        }

这里的问题是 submitData 之后的那一行没有得到 executed.I 搜索并看到原因是因为 submitData 从来没有 returns 所以它没有得到叫。但是我没有找到任何示例代码。有人可以告诉我解决这个问题的示例代码吗?

我想在submitData之后执行的逻辑是隐藏shimmerLayout并显示recyclerView,但是因为那个逻辑是在提交数据之前,所以它们是立即执行的,所以加载数据时似乎没有shimmerLayout。

如您所说,submitData() 之后的行确实不会被执行,因为它没有 return。您在这里使用 Paging 3 到底想达到什么目的?

我有一个类似的疑问,我的 recyclerview 没有更新从 Paging 3 获取的数据,因为我使用的是 collect 运算符。 Dustin LamPaging 3 库的作者回答我 collect 替换为 collectLatest,这为我解决了问题。

在您的情况下,您已经在使用 collectLatest。一种快速解决方法是将 submitData 放在 collectLatest 的最后,因为这是导致问题的原因。

collectLatest 定义中所述,

Terminal flow operator that collects the given flow with a provided action. The crucial difference from collect is that when the original flow emits a new value then the action block for the previous value is cancelled.

请注意,将 collect 替换为 collectLatest 只解决了我的问题,因为最初我的 StateFlowemittingInitial 状态,但是当数据已准备就绪,它发出了 Success 状态,collect 运算符未收集该状态,因为 submitData 从未 returns,但 collectLatest 强制要取消先前的操作块并收集新值。

我不确定您的问题是否有解决方案,但您可以使用确切的 use case 编辑您的问题,或者如果您找不到任何替代方案,您可以直接询问 Dustin Lam就像我一样:)

我试过:submitData(lifecycle, it),它开始停在 Submit 之后的行上。 Here says:警告:直到 PagingSource 无效或适配器的刷新方法被调用,submitData() 方法才会暂停并且不会 return。这意味着 submitData() 调用之后的代码执行时间可能比您预期的要晚得多。