提问人:keegaroo65 提问时间:10/15/2023 更新时间:10/15/2023 访问量:68
当配套对象中的值发生更改时,如何正确使用 Jetpack Compose 中的可变性来更新文本?(科特林)
How to properly use mutability in Jetpack Compose to update Text when a value in a companion object is changed? (Kotlin)
问:
解释:
我有一个预算屏幕
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,但我不确定如何去做,实现示例令人困惑。没有发生异常,我的应用没有崩溃;它只是在我想要的时候没有重组。
请帮忙:]
~记
答:
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
评论