提问人:jack_the_beast 提问时间:10/25/2023 更新时间:10/27/2023 访问量:39
android:SharedFlow 收集了两次
android: SharedFlow collected twice
问:
我的 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)
知道是什么原因造成的吗?
答:
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)
}
}
评论
collect
onViewCreated
onStart
collectLatest
viewLifecycleOwner
collectWhenStarted()
repeatOnLifecycle()
)