Як подати початкове значення в текстове поле?


142

Я хотів би надати початкове значення текстовому полі і перемалювати його порожнім значенням, щоб очистити текст. Який найкращий підхід зробити це за допомогою API Flutter?

Відповіді:


105

(Із списку розсилки. Я не придумав цієї відповіді.)

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

3
Просто цікаво, на який розсилку ви посилалися у відповіді?
stt106

2
І як ми додаємо / замінюємо значення текстового поля до початкового значення?
застряг над потоком

2
Також не забудьте розпорядитися _controller на розпорядженні віджета. Це рекомендує Google. Це забезпечує звільнення ресурсів, коли вони не потрібні.
Амріт Пал Сінгх

89

Ви можете використовувати TextFormFieldзамість TextFieldі використовувати initialValueвластивість. наприклад

TextFormField(initialValue: "I am smart")

2
Я чомусь не міг використовувати це з динамічним об'єктом. Закінчив потребу в контролері.
S1r-

6
Це справедливо лише тоді, коли контролер не вказаний з TextFormField. docs.flutter.io/flutter/material/TextFormField/…
Alex Fallenstedt

@AlexFallenstedt немає необхідності в цій власності, коли контролер доступний
Самі Канафані

Я думаю, що це ризиковано, оскільки при перебудові дерева віджетів текст можна замінити початковим значенням.
Gökberk Yağcı

46

Вам не потрібно визначати окрему змінну в області віджетів, просто зробіть це в рядку:

TextField(
  controller: TextEditingController()..text = 'Your initial value',
  onChanged: (text) => {},
)

Що означає подвійні крапки у "TextEditingController () .. text"?
Рей Лі

3
@RayLi Це називається каскадним оператором. Для отримання інформації і приклад перевірки тут stackoverflow.com/questions/53136945 / ...
vovahost

1
Дякую!. Це ідеально підходить для динамічного створення віджетів із списків об’єктів :)
davaus

Це те, що я шукав !! Дуже дякую!
TaeJung Shim

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, ви можете безпосередньо використовувати InitiValue, як показано нижче

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 )
Кирило Кармазін

15

Я бачив багато способів зробити це тут. Однак я думаю, що це трохи ефективніше або принаймні стисло, ніж інші відповіді.

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.


4

Цього можна досягти, використовуючи 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');

TextField,

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

3
TextEdittingController _controller = new TextEdittingController(text: "your Text");

або

@override
  void initState() {
    super.initState();
    _Controller.text = "Your Text";
    }

-12

Якщо ви не знайшли відповіді на це, а також для тих, хто приходить сюди, шукаючи відповідь: InputDecorationОзнайомтеся з підказкою поля Попередній текст:

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

Текст підказки не є початковим значенням. Коли користувач щось вводить, воно піде. Початковий текст - це як попередньо написати щось для користувача.
Арман Ордухані

Це текст Підказки, не ініціалізатор значення
MRT

2
Це правда, але це добре для тих, хто потрапляє сюди, шукаючи текст підказки, але не знаю, як це назвати.
ThinkDigital
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.