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