Для свойства borderDecoration я превратил его в переменную, чтобы впоследствии я мог использовать его с синтаксисом троичного оператора для предоставления (логического) красного подчеркивания, если оно пустое или нет. Я использовал свойство 'enabledBorder', чтобы изменить подчеркивание на красный. Затем я создал переменную для «TextHint», если она пуста как «errorText», которая будет отображаться под текстовым полем, или будет пустой, если на входе есть текст.
Чтобы сделать это модульным, на самом деле вы можете поместить var 'borderDecoration' в другую папку и просто импортировать его здесь.
final _name = TextEditingController();
final borderDecoration = InputDecoration(
labelText: ' NAME ',
labelStyle: TextStyle(
fontFamily: 'Montserrat',
fontWeight: FontWeight.bold,
color: Colors.grey),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.green),
),
);
String errorText = '';
bool redUnderLine = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("title"),
),
body: Column(children: <Widget>[
SizedBox(height: 20.0),
TextField(
controller: _name,
decoration: redUnderLine
? borderDecoration.copyWith(
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.red)),
)
: borderDecoration),
Text(errorText, style: TextStyle(color: Colors.red)),
SizedBox(height: 20.0),
RaisedButton(
onPressed: () {
if (_name.value.text.isEmpty) {
setState(() => redUnderLine = true);
setState(() => errorText = "This field is empty");
} else {
setState(() => redUnderLine = false);
setState(() => errorText = "");
}
},
child: Text("SignUp"))
]),
);
}