Как мне ввести начальное значение в текстовое поле?

146

Я хотел бы ввести начальное значение в текстовое поле и перерисовать его с пустым значением, чтобы очистить текст. Как лучше всего это сделать с помощью API Flutter?

Сет Лэдд
источник

Ответы:

107

(Из списка рассылки. Я не придумал этого ответа.)

class _FooState extends State<Foo> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController(text: 'Initial value');
  }

  @override
  Widget build(BuildContext context) {
    return new Column(
      children: <Widget>[
        new TextField(
          // The TextField is first built, the controller has some initial text,
          // which the TextField shows. As the user edits, the text property of
          // the controller is updated.
          controller: _controller,
        ),
        new RaisedButton(
          onPressed: () {
            // You can also use the controller to manipuate what is shown in the
            // text field. For example, the clear() method removes all the text
            // from the text field.
            _controller.clear();
          },
          child: new Text('CLEAR'),
        ),
      ],
    );
  }
}
Сет Лэдд
источник
Наверное, намек на серверы той же цели.
dhuma1981 05
3
Просто интересно, на какой список рассылки вы ссылались в ответе?
stt106,
2
И как нам добавить / переопределить значение текстового поля в начальное значение?
stuckedoverflow
2
Кроме того, не забудьте разместить _controller в расположении виджета. Рекомендуется Google. Это гарантирует, что ресурсы высвобождаются, когда они не нужны.
Амрит Пал Сингх
91

Вы можете использовать TextFormFieldвместо TextFieldи использовать initialValueсвойство. например

TextFormField(initialValue: "I am smart")
Сами Канафани
источник
2
По какой-то причине я не мог использовать это с динамическим объектом. Закончился потребностью в контроллере.
S1r-Lanzelot
6
Это действительно только тогда, когда контроллер не указан с TextFormField. docs.flutter.io/flutter/material/TextFormField/…
Alex
1
@AlexFallenstedt нет необходимости в этом свойстве, когда доступен контроллер
Сами Канафани
Я думаю, что это рискованно, потому что при перестройке дерева виджетов ваш текст можно заменить начальным значением.
Gökberk Yağcı 01
51

Вам не нужно определять отдельную переменную в области виджета, просто сделайте это встроенным:

TextField(
  controller: TextEditingController()..text = 'Your initial value',
  onChanged: (text) => {},
)
vovahost
источник
Что означают двойные точки в «TextEditingController () .. text»?
Рэй Ли
3
@RayLi Это называется каскадным оператором. Для информации и примера проверьте здесь stackoverflow.com/questions/53136945/…
vovahost
1
Спасибо!. Это идеально подходит для динамического создания виджетов из списков объектов :)
Даваус
Это то, что я искал !! Большое спасибо!
Тэ Чжун Шим
1
@vovahost, к сожалению, отсутствует часть утилизации.
Крис Рутковски
28

Если вы используете TextEditingController, установите для него текст, как показано ниже

TextEditingController _controller = new TextEditingController();


_controller.text = 'your initial text';

final your_text_name = TextFormField(
      autofocus: false,
      controller: _controller,
      decoration: InputDecoration(
        hintText: 'Hint Value',
      ),
    );

и если вы не используете TextEditingController, вы можете напрямую использовать initialValue, как показано ниже

final last_name = TextFormField(
      autofocus: false,
      initialValue: 'your initial text',
      decoration: InputDecoration(
        hintText: 'Last Name',
      ),
    );

Для получения дополнительной информации TextEditingController

Нирав Бхавсар
источник
Я не уверен, что устанавливать начальное значение для textсвойства в соответствии с документами TextEditingController.textсвойства - хорошая идея : установка этого параметра уведомит всех слушателей этого TextEditingController, что им необходимо обновить (он вызывает notifyListeners). По этой причине это значение должно устанавливаться только между кадрами, например, в ответ на действия пользователя, а не во время этапов сборки, макета или рисования. ( api.flutter.dev/flutter/widgets/TextEditingController/text.html )
Кирилл Кармазин
16

Я видел много способов сделать это здесь. Однако я думаю, что это немного более эффективно или, по крайней мере, кратко, чем другие ответы.

TextField(
   controller: TextEditingController(text: "Initial Text here"),
)
Кент
источник
7

Если вы хотите обрабатывать несколько TextInputs в соответствии с запросом @MRT в комментарии к принятому ответу, вы можете создать функцию, которая принимает начальное значение и возвращает TextEditingControllerследующее:

initialValue(val) {
  return TextEditingController(text: val);
}

Затем установите эту функцию в качестве контроллера для TextInputи укажите ее начальное значение следующим образом:

controller: initialValue('Some initial value here....')

Вы можете повторить это для других TextInputs.

Muaad
источник
6

Этого можно добиться с помощью TextEditingController.

Чтобы получить начальное значение, вы можете добавить

TextEditingController _controller = TextEditingController(text: 'initial value');

или

Если вы используете, у TextFormFieldвас там есть initialValueнедвижимость. Что в основном предоставляет это initialValueконтроллеру автоматически.

TextEditingController _controller = TextEditingController();
TextFormField(
  controller: _controller,
  initialValue: 'initial value'
)

Чтобы очистить текст, вы можете использовать _controller.clear()метод.

Дебасмита Саркар
источник
4
TextEdittingController _controller = new TextEdittingController(text: "your Text");

или

@override
  void initState() {
    super.initState();
    _Controller.text = "Your Text";
    }
Сейед Али Агамали
источник
3

внутри класса,

  final usernameController = TextEditingController(text: 'bhanuka');

Текстовое поле,

   child: new TextField(
        controller: usernameController,
    ...
)
Потеря крови
источник
-12

Если вы не нашли ответа на этот вопрос и для тех, кто пришел сюда в поисках ответа: InputDecorationознакомьтесь с полем hintText:

new TextField(
  decoration: new InputDecoration(
    hintText:"My Text String."
  ),
...
user693336
источник
Текст подсказки не является начальным значением. Когда пользователь что-то набирает, это исчезает. Исходный текст похож на предварительную запись чего-либо для пользователя.
Arman Ordookhani 09
Это текст подсказок, а не инициализатор значения
MRT
2
Это правда, но это хорошо для тех, кто приходит сюда в поисках текста подсказки, но не знает, как это назвать.
ThinkDigital