我目前正在开发一个Jetpack Compose
项目,在该项目中我使用 API 实现了自定义图表Canvas
。我使用 aMutableStateFlow<List<Offset>?>
来表示我在画布上绘制的点列表。绘图逻辑在 Canvas Composable 中处理。
ViewModel
当我在using中将点列表设置为 null 时遇到问题_points.emit(null)
。尽管将点设置为 null,Canvas 似乎并不理解它应该清除以前绘制的内容。
这是相关代码的简化版本:
private val _points = MutableStateFlow<List<Offset>?>(null)
val points: StateFlow<List<Offset>?>
get() = _points
private fun updatePoints() = uiEventScope.launch {
val pointList = ArrayList<Offset>()
// Some logic to populate the list...
_points.emit(pointList)
}
private fun removePoints() = uiEventScope.launch {
// Some logic to clear the list or set it to null...
_points.emit(null)
}
val points by viewModel.points.colectAsState()
Canvas(
modifier = Modifier.fillMaxSize()
) {
points?.apply {
for (i in 0 until points.size - 1) {
// Drawing logic...
}
}
}
我预计将点设置为空会清除画布,但似乎以前的内容仍然存在。我将不胜感激任何关于为什么会发生这种情况以及如何确保画布在设置StateFlow
为空时清除其内容的见解。
感谢您的帮助!
我们需要处理列表为空的情况。当它为空时,我添加了一个带有背景颜色的空矩形。您可以根据需要更改此设置。但你需要用与此类似的逻辑来处理返回 null 的情况。您没有添加收集流量的位置。如果您不使用,
collectAsState
您可能需要在收集时调整此逻辑。