#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’.