gpt4 book ai didi

android - 每次 Activity 暂停和恢复时,StateFlow 都会发出

转载 作者:行者123 更新时间:2023-12-04 13:24:53 25 4
gpt4 key购买 nike

我有一个状态流,一旦 HTTP 请求与响应一起返回,就会发出一个值,该值将在 Activity 中显示为列表,我正在使用 Kotlin 协程 StateFlow用于 ViewModel 和 Activity 之间的通信。
我正在使用 androidx生命周期 repeatOnLifecycle像这样的功能:

lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.successFlow.collect { binding.recyclerView.adapter = ExampleAdapter(it) }
}
}
这在开始时工作正常,但后来我意识到每次用户转到另一个屏幕并返回前一个屏幕时,状态流都会重新发送在这种情况下将丢失列表状态的值,例如,如果用户滚动到项目 10在列表中然后转到另一个屏幕并返回列表将滚动到位置 0因为 setAdapter再次调用方法,使用 LiveData 时不是这种情况.
现在我需要处理 StateFlow状态和配置状态,我尝试使用 distinctUntilChanged方法,但正如文档所说 Applying 'distinctUntilChanged' to StateFlow has no effect .
这里的问题是如何实现相同的 LiveData使用 StateFlow 的行为.

最佳答案

您遇到了 recently described in a Medium post 的问题.每个流集合都重新开始,并且将一次又一次地接收该值,即使它没有更改。 LiveData另一方面,它知道每个观察者看到的数据版本,并且只会发送已经再次发布的数据。
解决您的问题的一个简单方法是将数据存储在某处并检查它是否已更改。您也可以使用 flowWithLifecycle() 收集流量做distinctUntilChanged()在它上面(注意在此之后使用缓冲运算符,否则值发射可能会丢失,如上面链接的帖子中所述)。
它看起来像这样:

viewModel.successFlow.flowWithLifecycle(lifecycle).distinctUntilChanged().onEach {
binding.recyclerView.adapter = ExampleAdapter(it)
}.launchIn(lifecycleScope)

但是,我认为您不应该在每次数据更改时都更换适配器!你应该这样做:
(binding.recyclerView.adapter as ListAdapter<*,*>).submitList(it)
(当然,你应该使用 ListAdapter 来工作)
这样一来,当新数据到达时,无论是相同数据还是不同数据,都不会受到干扰。

关于android - 每次 Activity 暂停和恢复时,StateFlow 都会发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69101899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com