所以,我想使用 StateFlow 而不是 LiveData,但我無法弄清楚我的邏輯有什么問題。
我有一個流,它有一個默認的空值。當我打開一個包含一些資料的對話框時,然后我選擇一個資料,我將新值發送到流。
第一次,對話框關閉后,collectLatest呼叫,我得到空值(init),發射后,我得到新值,很好。但是如果我再次打開對話框,選擇值,然后關閉對話框,collectLatest 樂趣呼叫了 3 次,我再次打開對話框......并且 collectLatest 呼叫了 4 次,依此類推。
所以這是非常糟糕的行為,我敢肯定,我做錯了什么,但我沒有看到錯誤。
在 liveData 中,預期的行為是在對話框關閉之后,觀察者 fun 只被呼叫一次。我想實作這一點。
我還檢查過,我只發出一次新值,所以沒有理由多次觸發 collectLatest。
視圖模型:
private val _previousManufacture = MutableStateFlow<PreviousManufactureView?>(null)
val previousManufacture = _previousManufacture.asStateFlow()
private suspend fun setPreviousManufactureByMachineId(machineId: String) {
val result = stateReportRepository.getPreviousManufactureByMachineId(machineId)
if (result is Result.Success) {
_previousManufacture.emit(result.data)
} else {
_previousManufacture.emit(null)
}
}
分段:
lifecycleScope.launchWhenCreated {
viewModel.previousManufacture.collectLatest {
var d = it
}
}
[更新]片段:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.vm = viewModel
initFlows()
}
private fun initFlows() {
lifecycleScope.launchWhenCreated {
viewModel.openStateOfWorkflowBrowser.collectLatest {
openStateOfWorkflowSelectionDialog()
}
}
...
}
uj5u.com熱心網友回復:
抱歉,我之前在評論中錯過了這一點,但我認為問題在于您呼叫launchWhenCreated的lifecycleScope是 Fragment 的,而不是它的viewLifecycle.lifecycleScope. 所以如果 Fragment 被重用(比如出現了一個對話框片段之后),舊的收集器不會被取消,而是添加一個新的,因為 Fragment 的生命周期還沒有結束,只有它之前的視圖的生命周期。viewLifecycle.lifecycleScope當您在 Fragment 中使用協程時,您幾乎應該總是使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480445.html
