【问题标题】:Flutter: How to call a function before onChanged Method from TextFormField gets called?Flutter:如何在调用 TextFormField 的 onChanged 方法之前调用函数?
【发布时间】:2022-01-08 15:35:18
【问题描述】:

我有一个用于十进制数字输入的可重复使用的 TextFormField 小部件。如果用户用逗号而不是点输入十进制数字,我想替换它。因此,为此我创建了一个可重用的 TextFormField 小部件,我想在 onChanged 方法之前用一个点替换逗号。但是如何在调用 onChanged 之前调用函数 replaceCommaWithDot() 呢? 这是可重复使用的 Widget:

class DecimalTextFormField extends StatelessWidget {
  const DecimalTextFormField({Key? key, this.onChanged})
      : super(key: key);
  final ValueChanged? onChanged;

  @override
  Widget build(BuildContext context) {

    replaceCommaWithDot(String inputNumber) {
      if (inputNumber.contains(',')) {
        String newText = inputNumber.replaceAll(',', '.');
        return newText;
      }
      return inputNumber;
    }

    return TextFormField(
      keyboardType: const TextInputType.numberWithOptions(decimal: true),
      // how to use replaceCommaWithDot method when onChanged gets called?
      onChanged: onChanged,
    );
  }
}

【问题讨论】:

    标签: flutter dart textfield textformfield statelesswidget


    【解决方案1】:

    如果您只想要结果(无需 ui 更新),您的 sn-p 就可以正常工作。

      onChanged: (value) {
            final v = replaceCommaWithDot(value);
            if (onChanged != null) onChanged!(v);
          },
    

    如果您还想更新 UI,可以使用inputFormatters

    
    class CustomFormater extends TextInputFormatter {
      replaceCommaWithDot(String inputNumber) {
        if (inputNumber.contains(',')) {
          String newText = inputNumber.replaceAll(',', '.');
          return newText;
        }
        return inputNumber;
      }
    
      @override
      TextEditingValue formatEditUpdate(
          TextEditingValue oldValue, TextEditingValue newValue) {
        return newValue.copyWith(text: replaceCommaWithDot(newValue.text));
      }
    }
    

    DecimalTextFormField 将返回

    return TextFormField(
      keyboardType: const TextInputType.numberWithOptions(decimal: true),
      // how to use replaceCommaWithDot method when onChanged gets called?
      inputFormatters: [
        CustomFormater(),
      ],
      onChanged: (value) {
        if (onChanged != null) onChanged!(value);
      },
    );
    

    更多关于TextInputFormatter.

    【讨论】:

      【解决方案2】:

      您最好使用RegEx。在TextFormFieldinputFormatters 中添加一个禁止逗号的表达式。它不会取代它,但您将无法编写它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 2023-01-07
        • 2015-08-20
        • 2021-10-29
        • 1970-01-01
        • 2021-09-21
        • 2021-08-21
        相关资源
        最近更新 更多