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

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


person Seth Ladd    schedule 04.04.2017    source источник


Ответы (10)


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

TextFormField(initialValue: "I am smart")
person Sami Kanafani    schedule 17.07.2018
comment
По какой-то причине я не мог использовать это с динамическим объектом. Закончился потребностью в контроллере. - person S1r-Lanzelot; 19.01.2019
comment
Это действительно только тогда, когда контроллер не указан с TextFormField. docs.flutter.io/flutter/material/TextFormField/ - person Alex Fallenstedt; 10.03.2019
comment
@AlexFallenstedt нет необходимости в этом свойстве, когда контроллер доступен - person Sami Kanafani; 10.03.2019
comment
Я думаю, что это рискованно, потому что при перестроении дерева виджетов ваш текст можно заменить начальным значением. - person Gökberk Yağcı; 01.12.2019

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

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'),
        ),
      ],
    );
  }
}
person Seth Ladd    schedule 04.04.2017
comment
Наверное, намек на серверы той же цели. - person Dhrumil Shah - dhuma1981; 05.07.2018
comment
Просто интересно, на какой список рассылки вы ссылались в ответе? - person stt106; 29.10.2018
comment
И как нам добавить / переопределить значение текстового поля в начальное значение? - person stuckedoverflow; 22.02.2019
comment
Кроме того, не забудьте разместить _controller в расположении виджета. Рекомендуется Google. Это гарантирует, что ресурсы высвобождаются, когда они не нужны. - person amrit; 30.09.2019

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

TextField(
  controller: TextEditingController()..text = 'Your initial value',
  onChanged: (text) => {},
)
person vovahost    schedule 11.06.2019
comment
Что означают двойные точки в тексте TextEditingController () ..? - person Ray Li; 16.08.2019
comment
@RayLi Это называется каскадным оператором. Для получения информации и примеров см. Здесь stackoverflow.com/questions/53136945/ - person vovahost; 16.08.2019
comment
Спасибо!. Это идеально подходит для динамического создания виджетов из списков объектов :) - person davaus; 17.09.2019
comment
Это то, что я искал !! Большое спасибо! - person TaeJung Shim; 25.05.2020
comment
@vovahost, к сожалению, отсутствует часть утилизации. - person Chris Rutkowski; 29.05.2020
comment
Это может быть плохо, потому что вы должны избавиться от TextEditingController в методе виджета dispose (). - person Travis Reeder; 10.07.2020

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

TextField(
   controller: TextEditingController(text: "Initial Text here"),
)
person Kent    schedule 09.12.2019
comment
самый простой ответ - person Adham; 09.11.2020
comment
Коротко и просто. Мне нравится этот ответ. Спасибо - person jsgrewal12; 27.11.2020

Если вы используете 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

person Nirav Bhavsar    schedule 17.12.2018
comment
Я не уверен, что устанавливать начальное значение для свойства text в соответствии с документами свойства TextEditingController.text - хорошая идея: установка этого значения уведомит всех слушателей этого TextEditingController, что им необходимо обновить (он вызывает notifyListeners). По этой причине это значение следует устанавливать только между кадрами, например. в ответ на действия пользователя, а не на этапах сборки, макета или рисования. (api.flutter.dev/flutter/widgets/TextEditingController/text.html) - person Kirill Karmazin; 22.08.2019

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

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

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

or

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

TextFormField(
  initialValue: 'initial value'
)

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

person Debasmita Sarkar    schedule 12.11.2019
comment
Вы не можете иметь controller и initialValue оба ненулевых значения для TextFormField - person Slick Slime; 28.01.2021

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

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

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

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

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

person Muaad    schedule 25.11.2018

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

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

TextField,

   child: new TextField(
        controller: usernameController,
    ...
)
person BloodLoss    schedule 30.01.2019

Вы можете делать все вышеперечисленное, но если вы хотите, чтобы API отображал ваши данные при загрузке, он отображается как страница профиля. так вот код:

TextEditingController _nameController = TextEditingController(); // initialize the controller
 // when API gets the data, do this:
 _nameController.text = response.data.fullName; or _nameController.text = "Apoorv Pandey"

Надеюсь, это все проясняет. Удачного кодирования!

person Apoorv Pandey    schedule 13.05.2021

Простой и эффективный способ

Назначьте контроллер своему TextFormField или TextField, и в initState вы можете инициализировать его начальным значением, как это

_controller = TextEditingController(text: 'Your initial value');
person Pawan Meena    schedule 17.07.2021