【问题标题】:Can I use object properties as a mutableState in kotlin compose?我可以在 kotlin compose 中使用对象属性作为 mutableState 吗?
【发布时间】:2022-07-27 22:37:57
【问题描述】:

此问题的代码已更改和减少!

我有一个名为“游戏”的类,我想在组合骰子值中显示。并且我想在每次新回合开始和回合结束时使用新值更新可组合。

class Game (val board: Board, var player1: Player, var player2: Player) {
    var dices = Dices()
} 
class Dices (var first: Int = 0, var second: Int = 0) {
    fun rollDices() {
        first = rollDice()    //Returns a value between 1 and 6
        second = rollDice()
    }
    fun resetDices() {
        first = 0
        second = 0
    }
    fun areEqual() = first == second
} 

我有一个可组合函数“gameView”,它调用“diceView”,这是一个可组合函数,它制作 2 个盒子并将骰子值放在它们上面。 因为“骰子”是一个对象,它没有获得新的引用,它也不会自我更新,我也不能更改值,因为它在函数内部。

@Composable
fun gameView(game: Game) {
    paintBoard(game.board)

    val dices by remember {mutableStateOf(game.dices)}

    diceView(dices = dices, onClick = { game.newTurn()})
}

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: kotlin view android-jetpack-compose


    【解决方案1】:

    如果您使用 MutableState 更新类,您的 Composables 监听这些值将触发重组任何这些值的变化

    class Dices(first: Int = 0, second: Int = 0) {
    
        var firstDice by mutableStateOf(first)
        var secondDice by mutableStateOf(first)
    
        fun rollDices() {
            firstDice = rollDice()    //Returns a value between 1 and 6
            secondDice = rollDice()
        }
    
        fun resetDices() {
            firstDice = 0
            secondDice = 0
        }
    
        fun areEqual() = firstDice == secondDice
    }
    

    例子

    Column(modifier = Modifier.fillMaxSize()) {
        val dices = remember { Dices(1, 1) }
        Text("Dice1: ${dices.firstDice}")
        Text("Dice2: ${dices.secondDice}")
    
        Button(onClick = { dices.rollDices() }) {
            Text("Roll")
        }
    
        Button(onClick = { dices.resetDices() }) {
            Text("Reset")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-24
      • 2015-12-23
      • 2021-07-25
      • 2011-12-22
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      相关资源
      最近更新 更多