我正在尝试实现一个 TextField,它输入一个数量并在键入后立即对其进行格式化,并将其限制为 100,000。
@Composable
fun MainScreen(
viewModel: MyViewModel
) {
val uiState by viewModel.uiState.collectAsState()
Column {
AmountSection(
uiState.amount,
viewModel::updateAmount
)
Text(text = viewModel.logs)
}
}
@Composable
fun AmountSection(
amount: TextFieldValue,
updateAmount: (TextFieldValue) -> Unit
) {
BasicTextField(
value = amount,
onValueChange = updateAmount,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number
)
)
我的视图模型:
class MyViewModel: ViewModel() {
private val _uiState = MutableStateFlow(MyUiState())
val uiState: StateFlow<MyUiState> = _uiState
var logs by mutableStateOf("")
var text = ""
fun updateAmount(amount: TextFieldValue) {
val formattedAmount: String = amount.text.getFormattedAmount()
text += "input = ${amount.text}\n"
text += "output = $formattedAmount \n"
logs = text
_uiState.update {
it.copy(amount = TextFieldValue(formattedAmount, TextRange(formattedAmount.length))
}
}
}
data class MyUiState(val amount: TextFieldValue = TextFieldValue())
(logs
并且text
仅用于记录目的。发现很难共享 logcat 输出,因此以这种方式呈现)
结果:
- 当我按 6 时,输入是预期的“12,3456”(忽略货币)
- 我的
getFormattedAmount()
函数将最后六个删除为(123456 > 100000)。它输出“12,345”,这也是正确的。“12,345”是屏幕上显示的内容。 - 但是当我按 7 时,我得到输入“12,34567”。那个6是哪里来的??它不在
uiState.amount
。
(请忽略最后一个输出行。getFormattedAmount
仅在数量超过限制时删除最后一个字符,并且它给出了错误的输出,因为它没有预料到该输入)
我觉得我在这里犯了一些非常愚蠢的错误,如果有人能帮助我找出答案,我将非常感激。