TextField и TextFormField

Последнее обновление: 12.02.2021

Для ввода текста во Flutter может применяться виджет TextField:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      home:  Scaffold(
        body: TextField(),
        appBar: AppBar(title: Text("METANIT.COM")),)
  ));
}
Виджет TextField и ввод текста в Flutter

Следует отметить, что для виджета TextField необходимо, чтобы один из родительских контейнеров представлял виджет Material или такие виджеты, как Card, Dialog, Drawer или Scaffold (как в примере выше).

Конструктор виджета принимает довольно много параметров, поэтому отмечу лишь некоторые:

  • decoration: задает стилизацию виджета с помощью объекта InputDecoration

  • enabled: значение типа bool, которое указывает, доступно ли для ввода текстовое поле (при значении false поле для ввода недоступно)

  • expands: значение типа bool, которое указывает, будет ли виджет заполнять все доступное пространство контейнера

  • keyboardType: устанавливает тип клавиатуры в виде объекта TextInputType

  • maxLength: максимальное количество символов, которое можно ввести в текстовое поле

  • maxLines: максимальное количество строк

  • minLines: минимальное количество строк

  • obscureText: значение типа bool, которое указывает, будет ли виджет скрывать с помощью маски вводимые символы (например, при вводе пароля)

  • obscuringCharacter: задает символы, которые применяются в качестве маски для вводимых символов, если параметр obscureText равен true.

  • readOnly: значение типа bool, которое указывает, можно ли изменять текст в виджете

  • style: стиль вводимого текста в виде объекта TextStyle

  • textAlign: задает горизонтальное выравнивание текста в виде объекта TextAlign

  • textAlignVertical: задает вертикальное выравнивание текста в виде объекта TextAlignVertical

  • textDirection: устанавливает направление текста с помощью объекта TextDirection

Применим некоторые параметры:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      home:  Scaffold(
        body: TextField(
            style: TextStyle(fontSize: 22, color: Colors.blue),
            maxLines: 10,
            minLines: 5),
        appBar: AppBar(title: Text("METANIT.COM")))
  ));
}
Miltiline TextField in Flutter

Оформление поля ввода

С помощью параметра decoration, который представляет объект InputDecoration, можно стилизовать виджет TextField.

Некоторые основные параметры конструктора класса InputDecoration:

  • border: устанавливает границу виджета в виде объекта InputBorder. По умолчанию виджет имеет нижнюю границу. Если надо полностью убрать границу, то можно использовать значение InputBorder.none

    Для создания границы можно принимать еще два класса: OutlineInputBorder (создает границу вокруг элемента) и UnderlineInputBorder (создает только нижнюю границу).

  • contentPadding: устанавливает отступы от границ виджета при вводе текста, представляет объект EdgeInsetsGeometry

  • fillColor: устанавливает объект Color для заполнения виджета цветом

  • filled: значение типа bool, которое указывает, будет ли применяться заполнение виджета цветом из параметра fillColor (заполнение цветом применяется при значении true)

  • hintText: приглашение для ввода текста, которое появляется в виджете при отсутствии в нем текста

  • hintStyle: стиль текста из параметра hintText в виде объекта TextStyle

  • icon: виджет (объект Widget), который представляет иконку, отображаемую перед виджетом

  • helperText: вспомогательный текст, который появляется снизу справа от виджета и который указывает, как вводимое значение будет использоваться

  • helperStyle: стиль текста из параметра helperText в виде объекта TextStyle

  • labelText: текст метки, которая появляется сверхе виджета и описывает предназначение текстового поля

  • labelStyle: стиль текста из параметра labelText в виде объекта TextStyle

Например, уберем границу, но добавим фоновый цвет виджета:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      home:  Scaffold(
        body: TextField(decoration: InputDecoration(
            border: InputBorder.none,
            hintText: "Введите логин",
            fillColor: Colors.black12,
            filled: true
        )),
        appBar: AppBar(title: Text("METANIT.COM")),)
  ));
}
Граница виджета TextField и фоновый цвет в Flutter

Теперь установим полную границу по всем сторонам и применим иконку:

import 'package:flutter/material.dart';

oid main() {
  runApp(MaterialApp(
      home:  Scaffold(
        body: TextField(decoration: InputDecoration(
            border: OutlineInputBorder(),
            icon: Icon(Icons.login),
            hintText: "Введите логин",
            helperText: "Логин используется для входа в систему",
        )),
        appBar: AppBar(title: Text("METANIT.COM")))
  ));
}

Конструктор класса OutlineInputBorder создает границу вокруг виджета. Параметр helperText устанавливает вспомогательный текст, который появляется снизу виджета. А параметр icon устанавливает в качестве иконки иконку Icons.login из коллекции встроенных иконок.

Граница ви иконка виджета TextField в Flutter

Обработка ввода текста

С помощью параметров onChanged и onSubmitted конструктора мы можем установить функции, которые будут вызываться при вводе текста. Функция onChanged вызывается при каждом изменении текста в виджете. Функция onSubmitted вызывается, если пользователь завершил ввод, например, нажал кнопку ввода на клавиатуре.

Обе эти функции представляют функцию void ValueChanged (String value), которая в качестве параметра принимает строку - введенный текст.

Простейшее применение:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      home:  Scaffold(
        body: TextField(
            onSubmitted: (text) {
              print("onSubmitted");
              print("Введенный текст: $text");
            },
            onChanged: (text) {
              print("onChanged");
              print("Введенный текст: $text");
        }),
        appBar: AppBar(title: Text("METANIT.COM")))
  ));
}
Обработка ввода текста в TextField и onSubmitted и onChanged в Flutter

Как видно из выполнения программы, функция onChanged вызывается при каждом изменении ввода - добавлении или удалении символа, тогда как функция onSubmitted срабатывает один раз при завершении.

Соответственно, используя данные функции, можно изменять состояние виджета:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      home:  Scaffold(
        body: Person(),
        appBar: AppBar(title: Text("METANIT.COM")))
  ));
}

class Person extends StatefulWidget {

  Person({ Key key}) : super(key: key);

  @override
  _PersonState createState() => _PersonState();
}
class _PersonState extends State<Person>{

  String _name = "Tom";

  _changeName(String text){
    setState(() =>_name = text);
  }
  @override
  Widget build(BuildContext context) {

    return Column(children:[
      Text("Имя пользователя: $_name", style: TextStyle(fontSize: 22)),
      TextField(
        style: TextStyle(fontSize: 22),
        onChanged: _changeName)
    ],
    crossAxisAlignment: CrossAxisAlignment.start);
  }
}

В данном случае для виджета Person определен класс состояния _PersonState, который хранит имя условного пользователя в виде переменной _name. А при вызове функции onChanged будет выполнять метод _changeName(), в котором изменит значение переменной _name.

Для проверки ввода вводимое значение выводится в виджет Text, размещенный выше TextField.

Обработка ввода текста в TextField и onChanged и изменение состояния виджета в Flutter

TextFormField

Виджет TextFormField во многом аналогичен TextField, также представляет текстовое поле и предоставляет те же возможности за тем исключением, что он добавляет к параметрам конструктора параметр initialValue, с помощью которого можно указать начальное значение в текстовом поле:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      home:  Scaffold(
          body: Person(),
          appBar: AppBar(title: Text("METANIT.COM")))
  ));
}

class Person extends StatefulWidget {

  Person({ Key key}) : super(key: key);

  @override
  _PersonState createState() => _PersonState();
}
class _PersonState extends State<Person>{

  String _name = "Tom";

  _changeName(String text){
    setState(() =&g; _name = text);
  }

  @override
  Widget build(BuildContext context) {

    return Column(children:[
      Text("Имя пользователя: $_name", style: TextStyle(fontSize: 22)),
      TextFormField(initialValue: _name,
          style: TextStyle(fontSize: 22),
          onChanged: _changeName)
    ],
        crossAxisAlignment: CrossAxisAlignment.start);
  }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850