Почему начальное значение не обновляется и не отображается? - PullRequest
0 голосов
/ 27 января 2020

Я вернул номер I C пациента из виджета RegisteredPatient, однако начальное значение не обновляется и не отображается. Я попытался напечатать значение пациента I C, но я не понимаю, почему начальное значение не обновляется. Я даже пробовал с settate.

TextFormField(
  initialValue: ic,
  validator: (val) => val.isEmpty ? 'Enter patient IC' : null,
  decoration: textInputDecoration.copyWith(
    hintText: 'Patient IC e.g. 960XXXXXXXXX'
  ),
  onChanged: (val) {
    setState(() => ic = val);
  },
  onTap: () async {
    ic = await Navigator.push(
      context, 
      MaterialPageRoute(builder: (context) => RegisteredPatient())
    );
  },
),

Ответы [ 2 ]

1 голос
/ 27 января 2020
Жизненный цикл

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);
  },
),
}
1 голос
/ 27 января 2020

Если я правильно понял вашу проблему, вы хотите, чтобы значение текстового поля обновлялось, когда вы возвращаетесь с маршрута RegisteredPatient. Для этого вы должны сделать следующее: Декларация

TextEditingController _textEditingController =  TextEditingController();

на вашем TextFormField

onTap: () async {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => RegisteredPatient())
  ).then((newIcValue){
    setState(() {
      _textEditingController.text = newIcValue;
    });
  });
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...