当配套对象中的值发生更改时,如何正确使用 Jetpack Compose 中的可变性来更新文本?(科特林)

How to properly use mutability in Jetpack Compose to update Text when a value in a companion object is changed? (Kotlin)

提问人:keegaroo65 提问时间:10/15/2023 更新时间:10/15/2023 访问量:68

问:

解释:

我有一个预算屏幕

Home.kt 类的基础知识在这里:

@Composable
fun Home(navController: NavController) {
    var currentBalance = Budget.currentBalance

    Column(
        /* ... */
    ) {
        /* ... */
    }
}

文本在这里确定(在上面显示的列中深处):

Text(
    text = if (currentBalance>= 0) // this ternary operator adds the "$" and/or "-" cleanly
        "\$${"%.${2}f".format(currentBalance)}" // eg. 2.56 -> $2.56
    else "-\$${"%.${2}f".format(-currentBalance)}", // eg. -7.94 -> -$7.94
    textAlign = TextAlign.Center,
    color = MaterialTheme.colorScheme.onPrimary,
    style = MaterialTheme.typography.displayLarge
)

我的 Budget.kt 类基础知识在这里:

class Budget {
    companion object {
        var currentBalance: Double = 0.0
            get() = field
            private set(value) {
                field = value
            }

        /* ... */

        private fun AddBalance(funds: Double) {
            Companion.currentBalance += funds
            Save()
        } // Adds money to Balance

        private fun RemoveBalance(funds: Double) {
            Companion.currentBalance -= funds
            Save()
        } // Removes money from Balance

        /* ... */
    }
}

AddBalance() 和 RemoveBalance() 是从另一个基于类型处理所有事务的方法调用的,我已经通过日志确认 Budget.currentBalance 正在正确更改,如果您重新打开应用程序(余额保存在文本文件中)或通过实时更新重新组合它,文本会按预期更新;

文本不会立即重构。

尝试的解决方案:

首先,我尝试将 Home().currentBalance 更改为 mutableDoubleState,因为其他值就是这样做的

@Composable
fun Home(navController: NavController) {
    var currentBalance: MutableDoubleState = remember {
        mutableDoubleStateOf(Budget.currentBalance)
    }

    Column(
        /* ... */
    )
}

但这不起作用,我从这个线程中得出结论,我需要以某种方式从 Budget.Companion 更改 Home().currentBalance.value,但我不确定如何去做,实现示例令人困惑。没有发生异常,我的应用没有崩溃;它只是在我想要的时候没有重组。

请帮忙:]

~记

人造人 科特林 android-jetpack-compose 可变状态

评论


答:

1赞 Vivek Gupta 10/15/2023 #1

撰写状态的跟踪更改。您尚未在配套对象中定义任何状态。将当前余额字段更改为可变状态对象。

var currentBalance = 
    mutableDoubleStateOf(0.0)

此外,您还需要更改添加和删除方法。

 fun AddBalance(funds: Double) {
        Companion.currentBalance.value += funds
        Save()
    }

那么你可以像这样在可组合对象中使用 currentBalance 对象

 var currentBalance = Budget.currentBalance.value

如果您发现每次都懒得对 currentBalance 使用 .value,那么

   var currentBalance by mutableStateOf(0.0)
  private set

那么你的 add 方法将是

 fun addBalance(funds : Double){
  currentBalance += funds
}

您可以在可组合项中使用您当前的余额

  var currentBalance = Budget.currentBalance

评论

0赞 keegaroo65 10/15/2023
感谢您的快速回复!这完全符合预期:)我尝试了类似的解决方案,但在我的可组合文件中,我使用了 Budget.currentBalance 而不是 Budget.currentBalance.value,后者不起作用,但这确实有效。感谢您抽出宝贵时间:D