android:SharedFlow 收集了两次

android: SharedFlow collected twice

提问人:jack_the_beast 提问时间:10/25/2023 更新时间:10/27/2023 访问量:39

问:

我的 viewModel 中有一个简单的:SharedFlow

private val _navigationEvent = MutableSharedFlow<PreCheckoutNavigationEvent>()
val navigationEvent = _navigationEvent.shareIn(viewModelScope, SharingStarted.Lazily )

(PreCheckoutNavigationEvent是密封类)

它的发射方式如下:

_navigationEvent.emit(/*new instance of PreCheckoutNavigationEvent*/)

并收集在一个片段中:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        collectWhenStarted(viewModel.navigationEvent) {
           navigate(it)
        }
}

protected fun <T : Any?> collectWhenStarted(
        flow: Flow<T>,
        collector: suspend (value: T) -> Unit
    ) =
        lifecycleScope.launch {
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
                flow.collectLatest(collector)
            }
        }

问题是 GET 对同一个对象执行了两次。 我在应用程序中的任何地方使用都没有任何问题。只有这个流程给我带来了问题。我什至试图收集,但它仍然收集了两个排放物navigate()collectWhenStarted()viewModel.navigationEvent.debounce(500)

知道是什么原因造成的吗?

Android Kotlin Kotlin-Flow

评论

0赞 Steyrix 10/25/2023
由于生命周期的原因,是否有可能发生这种情况?你排队 2 次,因为发生在之前。两个回调都会触发。不过只是一个猜测collectonViewCreatedonStartcollectLatest
2赞 Pawel 10/25/2023
触摸视图时应使用。viewLifecycleOwner
0赞 jack_the_beast 10/25/2023
@Pawel你是对的,我在写的时候误读了文档。我感到困惑的是,它只是发生在这一次,而且视图没有经历任何生命周期变化。如果需要,请随时发布带有正确解决方案的答案collectWhenStarted()
0赞 jack_the_beast 10/25/2023
@Steyrix不,根据 [文档] (developer.android.com/topic/libraries/architecture/coroutines,这实际上是正确的使用位置repeatOnLifecycle())

答:

0赞 jack_the_beast 10/27/2023 #1

多亏了@Pawel通过做解决了

protected fun <T : Any?> collectWhenStarted(
        flow: Flow<T>,
        collector: suspend (value: T) -> Unit
    ) =
        viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                flow.collectLatest(collector)
            }
        }