Жизненный цикл
TextFormField
управляется внутренне его собственным состоянием (_TextFormFieldState
), где у него есть TextEditingController
, если вы не предоставите свой собственный и установите initialValue
только при первом построении и вставке виджета в дерево (таким образом, создайте RenderObject
для этого виджета).
Вы можете взглянуть на _TextFormFieldState
и посмотреть, где используется initialValue
.
@override
void initState() {
super.initState();
if (widget.controller == null) {
_controller = TextEditingController(text: widget.initialValue);
} else {
widget.controller.addListener(_handleControllerChanged);
}
}
Это означает, что если вы полностью не уничтожите / не удалите этот виджет из дерева (например, закрыв экран, в который он вставлен), он никогда не обновит это значение, но вам это и не нужно, потому что созданный TextEditingController
должен держать его на экране.
Это означает, что если вы хотите обновить значение из TextFormField
, которое уже построено, вы должны указать свой TextEditingController
и установить соответствующий текст.
TextEditingController _controller;
void initState(){
_controller = TextEditingController(text: ic);
}
void build(BuildContext context) {
return TextFormField(
controller: _controller,
validator: (val) => val.isEmpty ? 'Enter patient IC' : null,
decoration: textInputDecoration.copyWith(
hintText: 'Patient IC e.g. 960XXXXXXXXX'
),
onTap: () async {
final String value = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => RegisteredPatient())
);
setState(() => _controller.text = value);
},
),
}