flutter TextField получает текст с помощью TextEditingController, но получает пустой

#flutter #flutter-layout

Вопрос:

У меня есть два простых виджета текстового поля и одна пользовательская страница «PublishAction», включая кнопку отправки.

 child: Column(
  children: [
    TextField(
      decoration: const InputDecoration(labelText: "Topic"),
    ),
    TextField(
      decoration: const InputDecoration(labelText: "Context"),
    ),
    PublishAction(
      topic: "flutter/topic",
      message: "Hello World",
    ),
  ],
),
 

и я пытаюсь использовать TextEditingController для обработки текста, передавая значения в пользовательское «PublishAction», как показано ниже

 final _topicController = TextEditingController();
final _messageController = TextEditingController();

child: Column(
  children: [
    TextField(
      controller: _topicController,
      decoration: const InputDecoration(labelText: "Topic"),
    ),
    TextField(
      controller: _messageController,
      decoration: const InputDecoration(labelText: "Context"),
    ),
    PublishAction(
      topic: _topicController.text,
      message: _messageController.text,
    ),
  ],
),
 

но на моей странице PublishAction после того, как я распечатал ее, я обнаружил, что оба значения были пустыми

Я пробовал что-то подобное, но это работает довольно хорошо

 child: Column(
  children: [
    TextField(
      controller: _topicController,
      decoration: const InputDecoration(labelText: "Topic"),
      onchange: () {
        print(_topicController.text);
      }
    ),
  ],
),
 

как мне не получить пустое значение при передаче TextEditingController.text в качестве параметра функции?

Редактировать:

вот как выглядит PublishAction:

 class PublishAction extends StatelessWidget {
  final String topic;
  final String message;

  const PublishAction({
    Key? key,
    required this.topic,
    required this.message,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return FloatingActionButton(
        child: const Icon(Icons.send),
        onPressed: () {
          print("topic - $topic, message - $message");
        });
  }
}
 

и вывод:

 topic - , message -
 

Ответ №1:

Для этого вам нужно использовать метод OnChanged (), как показано ниже->

             onChanged: (val) {
              setState(() {
                _topicController.text = val.toString();
              });
            },
 

Попробуйте это, это поможет вам, и дайте мне знать о любой проблеме?
Для получения более подробной информации вы можете увидеть это.

Комментарии:

1. но не могли бы вы объяснить, почему добавление этой строки решит проблему?

2. Когда вы вводите что-то в текстовое поле, ввод изменяется, поэтому его следует передать контроллеру.

3. Я обнаружил, что использование onSubmittd вместо onChange является более разумным. при использовании onChange текст в текстовом поле будет обновляться каждый раз, поэтому курсор всегда находится в начальной позиции.

4. Да, так будет лучше.

Ответ №2:

здесь, в этом коде, вы указываете final значения '' или Empty TextEditingController() , чтобы его нельзя было изменить, поэтому вам нужно выполнить следующее, и это должно сработать,

 TextEditingController _topicController = TextEditingController();
TextEditingController _messageController = TextEditingController();

child: Column(
  children: [
    TextField(
      controller: _topicController,
      decoration: const InputDecoration(labelText: "Topic"),
    ),
    TextField(
      controller: _messageController,
      decoration: const InputDecoration(labelText: "Context"),
    ),
    PublishAction(
      topic: _topicController.text,
      message: _messageController.text,
    ),
  ],
),
 

Комментарии:

1. Я удаляю final , все еще не работает