简体   繁体   English

从 VisualTransformation Jetpack Compose TextField 获取值

[英]Get the value from VisualTransformation Jetpack Compose TextField

How can I get the transformed value from VisualTransformation in Jetpack compose TextField?如何从 Jetpack compose TextField 中的VisualTransformation获取转换后的值? since the only thing that is changing is the visual text not the actual input/buffered text?因为唯一改变的是视觉文本而不是实际的输入/缓冲文本?

class CurrencyAmountInputVisualTransformation(
    private val currencySymbol: String,
    private val unbufferedValueChange: (String) -> Unit
) : VisualTransformation {

    private val symbols = DecimalFormat().decimalFormatSymbols
    private val numberOfDecimals: Int = 2

    override fun filter(text: AnnotatedString): TransformedText {

        val zero = symbols.zeroDigit

        val inputText = text.text

        val intPart = inputText
            .dropLast(numberOfDecimals)
            .reversed()
            .chunked(3)
            .joinToString(symbols.groupingSeparator.toString())
            .reversed()
            .ifEmpty {
                zero.toString()
            }

        val fractionPart = inputText.takeLast(numberOfDecimals).let {
            if (it.length != numberOfDecimals) {
                List(numberOfDecimals - it.length) {
                    zero
                }.joinToString("") + it
            } else {
                it
            }
        }

        val formattedNumber = intPart + symbols.decimalSeparator.toString() + fractionPart
        val value = inputText.dropLast(numberOfDecimals)

        unbufferedValueChange("$value.$fractionPart")

        val newText = AnnotatedString(
            text = "$currencySymbol $formattedNumber",
            spanStyles = text.spanStyles,
            paragraphStyles = text.paragraphStyles
        )

        ...

        return TransformedText(newText, ...)
    }

I'm getting duplicate re-composition because of this approach since I have 2 mutable state, one for the input and one for the value that I'm getting from a lambda callback I passed to the VisualTransformation.由于我有 2 个可变的 state,一个用于输入,一个用于从传递给 VisualTransformation 的 lambda 回调中获得的值,因此我得到了重复的重新组合。

@Composable
internal fun CurrencyField(
   
) {

    val pattern = remember { Regex("^\\d*\\.?\\d*\$") }
    var input by remember { mutableStateOf("") }
    var amountInput by remember { mutableStateOf(0.00) }
   

    OutlinedTextInputField(
        text = input,
        onTextChanged = {
            if (it.isEmpty() || it.matches(pattern)) {
                input = it
            }
        },
        keyboardType = KeyboardType.NumberPassword,
        visualTransformation = CurrencyAmountInputVisualTransformation("PHP") {
            amountInput = it.toDouble()
        }
    )
}

Output: Input screenshot Output:输入截图

Is there any way I can get有什么办法可以得到

232323.23 232323.23

without using a callback in the VisualTransformation class?没有在VisualTransformation class 中使用回调?

Thanks.谢谢。

You have to apply the same filter used by the VisualTransformation您必须应用VisualTransformation使用的相同filter

    var text by remember { mutableStateOf("") }
    val visualTransformation = MyVisualTransformation()

    TextField(
        value = text,
        onValueChange = { text = it },
        visualTransformation = visualTransformation

    )

    val transformedText = remember(text, visualTransformation) {
        visualTransformation.filter(AnnotatedString(text))
    }.text.text

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM