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


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) => {},
)

Что означают двойные точки в «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.


6

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

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

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

или

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

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

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



3

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

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

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

   child: new TextField(
        controller: usernameController,
    ...
)

-12

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

new TextField(
  decoration: new InputDecoration(
    hintText:"My Text String."
  ),
...

Текст подсказки не является начальным значением. Когда пользователь что-то набирает, это исчезает. Исходный текст похож на предварительную запись чего-либо для пользователя.
Arman Ordookhani 09

Это текст подсказок, а не инициализатор значения
MRT

2
Это правда, но это хорошо для тех, кто приходит сюда в поисках текста подсказки, но не знает, как это назвать.
ThinkDigital
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.