Flatter TextField Widget errorText не передает значение - PullRequest
0 голосов
/ 03 марта 2020

Я создаю виджет текстового поля, который позволит им повторно использовать код для нескольких полей ввода. Кажется, все работает, за исключением того, что я испытываю странное поведение свойства errorText при использовании виджета. При прямом использовании того же кода erorText корректно обновляется, но из виджета это не происходит.

Печать в событии onChanged показывает, что значения в событии onChanged записаны правильно, но не передаются в errorText (проверка значение с функцией etTest)

Widget inputRfField(String type, TextEditingController _controller, String suffix) {
String errorMessage;
bool _errorTextValid ;
return Expanded(
  child: Padding(
    padding: const EdgeInsets.all(8.0),
    child: TextFormField(
      controller: _controller,
      onChanged: (_value) {

        double contValue = double.parse(_value);
        setState(() {
          if (type == 'Theta') {
            contValue <= 90 && contValue >= 0 ? rxThetaValid = false : rxThetaValid = true;
            rxThetaValid == true ? errorMessage = 'Theta 0-90 ' : errorMessage = null;
            _errorTextValid = rxThetaValid;
          } else if (type == 'Phi') {
            contValue <= 360 && contValue >= 0 ? rxPhiValid = false : rxPhiValid = true;
            rxPhiValid == true ? errorMessage = 'Phi 0-360 ' : errorMessage = null;
            _errorTextValid = rxPhiValid;
          } else if (type == 'Lpa') {
            contValue <= 90 && contValue >= 0 ? rxLpaValid = false : rxLpaValid = true;
            rxLpaValid == true ? errorMessage = 'ERR: Lpa 0-90 ' : errorMessage = null;
            _errorTextValid = rxLpaValid;
          }
          print('errorTextValid: '+ _errorTextValid.toString());
          print('controllerValue: ' + contValue.toString());
        });

      },
      keyboardType: TextInputType.numberWithOptions(decimal: false),
      style: TextStyle(color: Colors.amber),
      textAlign: TextAlign.end,
      decoration: InputDecoration(
        //prefixIcon: Icon(Icons.lock_open, color: Colors.grey),
        border: OutlineInputBorder(),
        labelText: type.toUpperCase(),
        suffixText: suffix,
        errorText: etTest(_errorTextValid) == true ? errorMessage : null,
      ),
    ),
  ),
);

Консоль возвращает

I / флаттер (31158): errorTextValid: true

I / флаттер (31158): controllerValue: 99.0

I / флаттер (31158): errorTextValid при errorText: ноль

I / флаттер (31158): errorTextValid: false

I / флаттер (31158): controllerValue: 9.0

I / флаттер (31158): errorTextValid при errorText: ноль

I / флаттер (31158): errorTextValid: true

I / флаттер (31158): значение контроллера: 96.0

I / flutter (31158): errorTextValid при errorText: null

Каким-то образом errorTextValid не передается. Тем не менее, когда не запускается это из виджета

child: TextFormField(
controller: rxFrequencyController,
    onChanged: (frequencyController) {
        double rxFreq = double.parse(frequencyController);
        rxFreq < 11200 || rxFreq > 12750 ? rxValid = true : rxValid = false;
        setState(() {});
    },
keyboardType: TextInputType.numberWithOptions(decimal: false),
style: TextStyle(color: Colors.amber),
textAlign: TextAlign.end,
decoration: new InputDecoration(
    //prefixIcon: Icon(Icons.lock_open, color: Colors.grey),
    border: OutlineInputBorder(),
    labelText: "RX frequency",
    suffixText: "MHz",
    errorText: rxValid == true ? 'Frequency out of range: 11200-12750 MHz' : null,
    ),
),

, он работает нормально.

Чего мне не хватает ???

...