最初显示表单时,是否可以执行TextFormField上的InputFormatters?

时间:2018-12-28 15:31:21

标签: flutter

inputFormatters上指定TextFormField时,initialValue不会处理inputFormatters

这似乎很奇怪。是否有推荐的方法来获取inputFormatters来格式化initialValue

例如,我有一个5位数字(即12345),应该在输入字段中用逗号分隔符(12,345)显示。默认情况下,它显示为12345,但是一旦我编辑该值,就会出现逗号分隔符。逗号分隔符应显示在初始值上。

3 个答案:

答案 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()]
    )