Как расширить TextInputFormatter, чтобы ограничить диапазон чисел И форматировать до 1 знака после запятой («000.0») . В Flutter

#flutter #dart

#трепетание #dart

Вопрос:

Идея состоит в том, чтобы ограничить пользователя вводом любого значения от 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 знаком после запятой?
Спасибо, ребята.

Ответ №1:

Вы можете сделать это, как показано ниже, используя строковый метод ‘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));
    }
  }
}
  

Комментарии:

1. Спасибо за ответ Куку. Здесь у меня ничего не получилось. Он регистрирует только одну цифру. Я прикрепляю GIF для показа: shorturl.at/jCY45

2. Я не вижу ‘shorturl.at/jCY45 — ГИФ.

3. Вы имеете в виду, что хотите ограничить десятичную длину переменной?

4. @LeonidasYopan Я добавил параметр CustomRangeTextInputFormatter для управления десятичной предельной длиной.

5. И вам нужно изменить ‘int.parse’ на ‘double.parse’.