从另一个片段返回后的 Kotlin StateFlow 多个订阅

Kotlin StateFlow multiple subscriptions after returning from another Fragment

我正在尝试在我的应用程序中使用 ViewModel 和 Fragment 之间的 MVVM 架构实现 StateFlow。

在 ViewModel 中:

...

private val _eventDataState = MutableStateFlow<EventDataState>(EventDataState.Loading)
val eventDataState: StateFlow<EventDataState> = _eventDataState

...

在片段中:

...

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        ...

        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.eventDataState.collect { eventDataState ->
                    when (eventDataState) {
                        is EventDataState.Loading -> {}
                        is EventDataState.Success -> onEventDataUpdated(data = eventDataState)
                        is EventDataState.Deleted -> onEventDataDeleted()
                    }
                }
            }
        }
        viewModel.getEventData()
    }

...

似乎一切正常:

2022-04-15 17:57:20.352 5251-5251/ ... E/EVENT: Data state: Success(...)

但是当我通过 Activity 的 SupportFragmentManager 切换到另一个 Fragment 然后点击返回按钮时,我从 StateFlow 收到了多个响应:

2022-04-15 17:57:30.358 5251-5251/ ... E/EVENT: Data state: Success(...)
2022-04-15 17:57:30.362 5251-5251/ ... E/EVENT: Data state: Success(...)

所以我切换到另一个片段并返回的次数越多 - 我从 StateFlow 获得的响应副本越多(这不是初始 StateFlow 值)。

我的猜测是,当另一个 Fragment 被调用时,第一个破坏了它的视图,但对 Flow 的订阅仍然存在,当从另一个 Fragment 返回时,第一个调用它的 onViewCreated 并因此创建了另一个订阅副本流动。然而,我无法在 Whosebug 或任何其他资源上找到任何解决方案。

我错过了什么?

您应该在片段中使用 viewLifecycleOwner.lifecycleScope.launchviewLifecycleOwner.lifecycleScope 当视图被销毁时,它的所有作业都将被取消。