我不明白为什么这种可变状态不起作用

I don't understand why this mutable state doesn't work

提问人:Alvaro Martinez 提问时间:5/3/2022 最后编辑:Phil DukhovAlvaro Martinez 更新时间:5/5/2022 访问量:274

问:

我有一个表格地图,我想检测其中 2 个表格何时发生冲突(因为可以通过拖放移动表格)。当它们碰撞时,我也想改变它们的颜色,但我的可变状态不起作用

启动可组合项,为每个表创建一个TableTableItem

CustomSurface{
    Box(
        modifier = Modifier
            .fillMaxSize()
            .onSizeChanged { size.value = it.toSize() }
    ){         
        mapScreenViewModel.tables.forEach {
            TableItem(table = it, size = size, mapScreenViewModel = mapScreenViewModel)
        }
    }
}

TableItem可组合的类有一个参数背景,它是 Color 的可变状态Table

@Composable
fun TableItem(
    table: Table, size: MutableState<Size>, mapScreenViewModel: MapScreenViewModel
){
    val offsetX = remember { mutableStateOf(table.x) }
    val offsetY = remember { mutableStateOf(table.y) }

    Box(
        Modifier[...]
            .background(table.background)
                 [...]
                        mapScreenViewModel.tables.filter { it != table }.forEach {
                            if(table collide it){
                                table.setCollidingColor()
                                it.setCollidingColor()
                            }else{
                                table.setNotCollidingColor()
                                it.setNotCollidingColor()
                            }
                        }

                 [...]

Table类,背景在外部声明constructor

class Table(
    [...]
) {
    var background by mutableStateOf(BlueDayLight)
    fun setCollidingColor() {
        background = Red500
    }

    fun setNotCollidingColor() {
        background = BlueDayLight
    }

    infix fun collide(table: Table): Boolean {
        return this.x < table.x + table.width.toPx
                && this.x + this.width.toPx > table.x
                && this.y < table.y + table.height.toPx
                && this.y + this.height.toPx > table.y
    }
}
人造人 科特林 拖放 android-jetpack-compose 可变

评论

0赞 Swapnil 5/3/2022
你能发布你的整个代码吗?
0赞 Alvaro Martinez 5/3/2022
我不能,如果我发布更多内容,我会收到错误
1赞 Richard Onslow Roper 5/4/2022
错误在于问题中的代码与文本的比例太大。你不能只是在这里转储代码块,而不解释为什么它们出现在问题中,它们可能与解决方案有什么关系,或者它们中的每一个都做了什么以及你期望它做什么。我完全不知道你想在这里问什么或实现什么;我看到的只是三大块代码。这不是网站的工作方式,请考虑阅读如何提出一个好问题
0赞 Alvaro Martinez 5/5/2022
如果您看到有 3 大块代码......

答: 暂无答案