在inputFormatters
上指定TextFormField
时,initialValue
不会处理inputFormatters
。
这似乎很奇怪。是否有推荐的方法来获取inputFormatters
来格式化initialValue
。
例如,我有一个5位数字(即12345),应该在输入字段中用逗号分隔符(12,345)显示。默认情况下,它显示为12345,但是一旦我编辑该值,就会出现逗号分隔符。逗号分隔符应显示在初始值上。
答案 0 :(得分:1)
您可以创建一个静态方法来验证您的initialValue
class MyFormater extends TextInputFormatter {
static String defaultFormat(String text) {
// Do whatever you want
return text;
}
@override
TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
// Your validations/formats
return null;
}
}
然后您可以按原样使用它
TextFormField(
initialValue: MyFormater.defaultFormat(someString),
inputFormatters: [MyFormater()],
)
我怀疑还有其他方法会在TextInputFormatter
引起关注之前触发它。 initialValue
意味着已经被验证并且可以用作占位符。
答案 1 :(得分:1)
您可以使用它直接将文本设置为控制器,而无需与文本字段进行交互
var textEditingController = TextEditingController();
textEditingController.value = myFormatter.formatEditUpdate(TextEditingValue(text: ''), TextEditingValue(text: 'my initial value'));
答案 2 :(得分:0)
您可以在inputFormatters
中设置自定义TextField
。
为此,您必须定义过滤器,例如,一个接受String并返回整齐(或过滤后的)String的函数。
在我的情况下,函数neatCost()
得到一个字符串,并用","
用3个3字符分隔,例如取“ 12345”并返回“ 12,345”。
用于创建自定义inputFormatters
:
class NeatCostFilterFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
final StringBuffer newText = StringBuffer();
newText.write(neatCost(newValue.text.replaceAll(",", "")));
print(newValue.text);
print(neatCost(newValue.text.replaceAll(",", "")).length);
return TextEditingValue(
text: newText.toString(),
selection: TextSelection.collapsed(offset: neatCost(newValue.text.replaceAll(",", "")).length),
);
}
}
和功能:
String neatCost(String cost) {
String res=cost;
if(cost!=null) {
for (int i = 3; i < res.length; i += 4) {
res = res.replaceRange(res.length - i, res.length - i, ",");
}
return res;
}else{
return "";
}
}
之后,您可以像这样将您的自定义格式设置为TextField
:
new TextField(
inputFormatters: <TextInputFormatter>[new NeatCostFilterFormatter()]
)