[Solved] Allow only specific input in TextFormField without validation in Flutter

Question

Asked by GrandMagus on November 29, 2021 (source).

I want to allow the user to only put maximum of 5 numbers between 1 and 10.000, but this TextFormField is not required and should not be submitted through Form validation, but I want to let the user know if he is adding this field, that he can not exceed 10.000 and he must put only numbers from 1 to 10.000. The code for the TextFormField:

TextFormField(
                                keyboardType: TextInputType.number,
                                controller: _number,
                                inputFormatters: <TextInputFormatter>[
                                  FilteringTextInputFormatter.digitsOnly //I have set this so the input is only numbers/digits
                                ],
                                decoration: kTextFieldDecoration.copyWith(
                                  hintText: 'Enter number between 1 and 10.000',
                                  labelText: 'Number from 1 to 10.000',
                                ),
                              ),

I'm not sure how to achieve this, I used regex validation for the rest of the fields, but since this field is not required, I can't validate it through Form validation. Any form of help is appreciated. Thanks in advance!

Answer

Question answered by HeIsDying (source).

May try the code below, for your reference https://stackoverflow.com/a/68072967/7972633

Updated version 1

class NumericalRangeFormatter extends TextInputFormatter {
  final double min;
  final double max;

  NumericalRangeFormatter({required this.min, required this.max});

  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {

    if (newValue.text == '') {
      return newValue;
    } else if (int.parse(newValue.text) < min) {
      return TextEditingValue().copyWith(text: min.toStringAsFixed(5));
    } else {
      return int.parse(newValue.text) > max ? oldValue : newValue;
    }
  }
}

keyboardType: TextInputType.numberWithOptions(),
inputFormatters: [
   LengthLimitingTextInputFormatter(5) // only allow 5 digit number
],

FLUTTER FLUTTER-TEXTFORMFIELD MOBILE
SHARE: