从另一个片段返回后的 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.launch
。 viewLifecycleOwner.lifecycleScope
当视图被销毁时,它的所有作业都将被取消。
我正在尝试在我的应用程序中使用 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.launch
。 viewLifecycleOwner.lifecycleScope
当视图被销毁时,它的所有作业都将被取消。