android-fragments 协同程序通道-流收集问题

g52tjvyc  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(135)

我在我的应用程序中使用了一个Activity,即多片段模型。我有一个sharedViewModel,它带有协程通道,用于在片段之间发送和接收数据。此外,我有一个自定义对话框片段作为整个应用的弹出窗口,其用户操作将观察剩余的片段。我的问题是,从自定义对话框发送的事件在片段收集部分没有频繁触发(2/5点击)。我正在添加代码库供您参考。
共享视图模型部件

private val _cornerDataChannel = Channel<CornerData>()
val cornerDataEvent: Flow<CornerData> = _cornerDataChannel.receiveAsFlow()

fun updateCornerDataEvent(data: CornerData) = viewModelScope.launch {
     Log.e(TAG, "Event Added")
     _cornerDataChannel.send(data)
}

自定义对话框片段中的发送部分

private fun myToolSelectionCallBack(tool: ToolDTO) =
        viewModel.updateCornerDataEvent(CornerData.ToolData(tool))

 private fun systemStreamSelectionCallBack(stream: StreamDTO) =
        viewModel.updateCornerDataEvent(CornerData.StreamData(stream))

接收碎片内的部件

private fun observeCornerItemSelectionCallBack() = lifecycleScope.launchWhenStarted {
        viewModel.cornerDataEvent.collect { event ->
            when (event) {
                is StreamData -> streamSelectionCallBack(data= event.data)
                is ToolData -> toolSelectionCallBack(data = event.data)
            }
        }
    }

在接收端部分,用户点击频繁丢失,但总是在视图模型下得到更新部分。

vmpqdwk3

vmpqdwk31#

不是点击的问题,这是因为您正在为多个观察者/接收者使用常规频道,但它应该是具有常规频道的单个接收者。您必须为具有单个发送者的多个接收者使用BroadcastChannels。现在BrodcastChannels已被弃用,它被替换为SharedFlow()

注意:此API自1.5.0起已过时。它将在1.6.0中被弃用,并显示警告,在1.7.0中显示错误。它将被替换为SharedFlow。
检查BroadcastChannels-OfficialDocs

相关问题