文本字段视觉转换因偏移映射原始到转换而崩溃返回无效映射

问题描述 投票:0回答:1

我有一个文本字段并试图实现类似的目标

  • 当我以编程方式为文本字段设置值时。它是登录表单上的用户名字段。如果用户之前保存过,则我们用“*”屏蔽文本字段中的前 4 个字符 就像“johndoe”==>“****doe”

username textfield

  • 但是当用户编辑意义时,如果用户想要输入另一个用户名,我想保持这种转换关闭并让用户输入字符。不,我无法添加按钮来隐藏/显示它。

我正在尝试通过视觉转换来做到这一点,但遇到了问题。 当我编辑时似乎出现错误,如

offsetmapping.originaltotransformed returned invalid mapping:
有人知道我怎样才能实现这个目标吗?

class UserNameMaskTransformation() : VisualTransformation {
    override fun filter(text: AnnotatedString): TransformedText {
        return maskFilter(text)
    }
}


fun maskFilter(text: AnnotatedString): TransformedText {
    var maskLen = 4
    var maskChar = "*"

    val maskingChars = AnnotatedString(maskChar.repeat(maskLen))

    val subString = AnnotatedString(text.substring(4))
    return TransformedText(maskingChars + subString, OffsetMapping.Identity)
    
}
android-jetpack-compose textfield android-jetpack android-compose-textfield
1个回答
0
投票

您在执行

maskFilter
方法时遇到问题!假设如果文本为空或少于 4 个字符,则该行中的应用程序将会崩溃
text.substring(4)
,因为如果文本为空或少于 4 个字符,则第四个索引不存在。

答案是取文本长度和数字4之间的最小值。这样,如果文本长度小于4,我们将使用文本长度作为要屏蔽的字符数,否则我们将使用数字4你提供。

这是更新后的代码:

fun maskFilter(text: AnnotatedString): TransformedText {
    var maskLen = 4
    var maskChar = "*"

    val m = min(maskLen, text.text.length)

    val maskingChars = AnnotatedString(maskChar.repeat(m))

    val subString = AnnotatedString(text.substring(m))
    return TransformedText(maskingChars + subString, OffsetMapping.Identity)
}
© www.soinside.com 2019 - 2024. All rights reserved.