首页 > 解决方案 > 如何扩展 TextInputFormatter 以将数字范围和格式限制为 1 个小数位 ("000.0") 。在颤振中

问题描述

这个想法是限制用户输入从 0 到任何给定最大值的任何值。

这是我到目前为止的代码。它确实可以限制最大值,但它不允许我使用小数(例如:10.7、35.3、98.2 等......)

class CustomRangeTextInputFormatter extends TextInputFormatter {
  final double maxValue;

  CustomRangeTextInputFormatter({@required this.maxValue});

  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {
    if (newValue.text == '')
      return TextEditingValue();
    else if (int.parse(newValue.text) < 0) return TextEditingValue().copyWith(text: '0');

    return int.parse(newValue.text) > maxValue ? TextEditingValue().copyWith(text: maxValue.toString()) : newValue;
  }
}

如何改进此代码以允许用户使用小数,同时将其限制为 1 个小数位?多谢你们。

标签: flutterdart

解决方案


您可以使用 String 方法“indexOf”和“substring”,如下所示。

class CustomRangeTextInputFormatter extends TextInputFormatter {
  final double maxValue;
  final int decimalLengthLimit;

  CustomRangeTextInputFormatter(
      {@required this.maxValue, @required this.decimalLengthLimit});

  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {
    if (newValue.text.contains('.')) {
      return TextEditingValue().copyWith(text: oldValue.text);
    }
    if (newValue.text.isEmpty) {
      return TextEditingValue(
        text: '',
        selection: TextSelection.collapsed(offset: 0),
      );
    }

    if (newValue.text.length == 1) {
      return TextEditingValue().copyWith(text: newValue.text);
    } else {
      return TextEditingValue().copyWith(text: newValue.text.substring(1, 2));
    }
  }
}

推荐阅读