<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>FlutterStack</title><generator>teletype.in</generator><description><![CDATA[FlutterStack]]></description><image><url>https://img3.teletype.in/files/e5/4a/e54ab4fc-3fd6-4cf6-b0d9-11deabc005ac.png</url><title>FlutterStack</title><link>https://teletype.in/@flutterstack</link></image><link>https://teletype.in/@flutterstack?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=flutterstack</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/flutterstack?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/flutterstack?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 05 Apr 2026 14:59:37 GMT</pubDate><lastBuildDate>Sun, 05 Apr 2026 14:59:37 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@flutterstack/UbGMW2dBXKN</guid><link>https://teletype.in/@flutterstack/UbGMW2dBXKN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=flutterstack</link><comments>https://teletype.in/@flutterstack/UbGMW2dBXKN?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=flutterstack#comments</comments><dc:creator>flutterstack</dc:creator><title>Создание формы с валидацией</title><pubDate>Sun, 06 Aug 2023 16:11:21 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2b/89/2b89c29e-8543-49f9-b5c8-31e1aa93874f.png"></media:content><description><![CDATA[<img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nDTvozHt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4wcpgnvc31arrkmguwo8.jpg"></img>Приложения часто требуют от пользователей ввода информации в текстовое поле. Например, для входа в систему требуется ввести адрес электронной почты и пароль.]]></description><content:encoded><![CDATA[
  <figure id="Atom" class="m_column">
    <img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nDTvozHt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4wcpgnvc31arrkmguwo8.jpg" width="880" />
    <figcaption><a href="https://t.me/f1utterstack" target="_blank">FlutterStack</a></figcaption>
  </figure>
  <p id="LA9M">Приложения часто требуют от пользователей ввода информации в текстовое поле. Например, для входа в систему требуется ввести адрес электронной почты и пароль.</p>
  <p id="Cvqz">Чтобы сделать приложения безопасными и удобными в использовании, необходимо проверять правильность введенной пользователем информации. Если пользователь правильно заполнил форму, следует обработать информацию. Если пользователь отправил неверную информацию, необходимо вывести на экран сообщение об ошибке.</p>
  <p id="epBp">В этом примере мы узнаем, как добавить проверку в форму с одним текстовым полем, выполнив следующие действия:</p>
  <ol id="iOlS">
    <li id="6kGi">Создать форму с глобальным ключом.</li>
    <li id="000e">Добавьте текстовое поле TextFormField с логикой валидации.</li>
    <li id="pNnc">Создать кнопку для проверки и отправки формы.</li>
  </ol>
  <p id="bxFd"><strong>1. Создание формы с глобальным ключом</strong></p>
  <p id="NMeD">Во-первых, создадим форму. Виджет Form выступает в качестве контейнера для группировки и проверки нескольких полей формы.</p>
  <p id="mKHu">При создании формы необходимо указать GlobalKey. Он уникально идентифицирует форму и позволяет выполнить ее проверку на следующем этапе.</p>
  <pre id="qCkd" data-lang="dart">import &#x27;package:flutter/material.dart&#x27;;

// Define a custom Form widget.
class MyCustomForm extends StatefulWidget {
  const MyCustomForm({super.key});

  @override
  MyCustomFormState createState() {
    return MyCustomFormState();
  }
}

// Define a corresponding State class.
// This class holds data related to the form.
class MyCustomFormState extends State&lt;MyCustomForm&gt; {
  // Create a global key that uniquely identifies the Form widget
  // and allows validation of the form.
  //
  // Note: This is a &#x60;GlobalKey&lt;FormState&gt;&#x60;,
  // not a GlobalKey&lt;MyCustomFormState&gt;.
  final _formKey = GlobalKey&lt;FormState&gt;();

  @override
  Widget build(BuildContext context) {
    // Build a Form widget using the _formKey created above.
    return Form(
      key: _formKey,
      child: const Column(
        children: &lt;Widget&gt;[
          // Add TextFormFields and ElevatedButton here.
        ],
      ),
    );
  }
}</pre>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="8qtJ"><strong>Совет:</strong> Использование глобального ключа является рекомендуемым способом обращения к форме. Однако если у вас более сложное дерево виджетов, то для доступа к форме внутри вложенных виджетов можно использовать метод Form.of().</p>
  </section>
  <p id="ivKL"></p>
  <p id="qlXF"><strong>2. Добавление поля TextFormField с логикой валидации</strong><br />Хотя форма уже создана, в ней нет возможности для ввода текста. Для этого необходимо создать текстовое поле TextFormField. Виджет TextFormField отображает текстовое поле с материальным дизайном и может отображать ошибки валидации при их возникновении.</p>
  <p id="yrkt">Для проверки вводимых данных в TextFormField используется функция validator(). Если вводимые пользователем данные не являются валидными, функция validator возвращает строку, содержащую сообщение об ошибке. Если ошибок нет, то валидатор должен возвращать null.</p>
  <p id="6RH1">Для данного примера создадим валидатор, который будет проверять, не пусто ли поле TextFormField. Если оно пустое, то возвращает сообщение об ошибке в дружественной форме.</p>
  <pre id="sXhh" data-lang="dart">TextFormField(
  // The validator receives the text that the user has entered.
  validator: (value) {
    if (value == null || value.isEmpty) {
      return &#x27;Please enter some text&#x27;;
    }
    return null;
  },
),</pre>
  <p id="6H0M"><strong>3. Создание кнопки для проверки и отправки формы</strong></p>
  <p id="2eYK">Теперь, когда у вас есть форма с текстовым полем, необходимо создать кнопку, на которую пользователь может нажать для отправки информации.</p>
  <p id="8AEl">Когда пользователь попытается отправить форму, следует проверить, является ли форма действительной. Если она действительна, то выводится сообщение об успешном завершении. Если нет, выводится сообщение об ошибке.</p>
  <pre id="8Eg8" data-lang="dart">ElevatedButton(
  onPressed: () {
    // Validate returns true if the form is valid, or false otherwise.
    if (_formKey.currentState!.validate()) {
      // If the form is valid, display a snackbar. In the real world,
      // you&#x27;d often call a server or save the information in a database.
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text(&#x27;Processing Data&#x27;)),
      );
    }
  },
  child: const Text(&#x27;Submit&#x27;),
),</pre>
  <h3 id="5kL6">Как это работает?</h3>
  <p id="U8MC">Для валидации формы используется ключ _formKey, созданный на первом этапе. С помощью метода _formKey.currentState() можно получить доступ к классу FormState, который автоматически создается Flutter при построении формы.</p>
  <p id="eX4h">Класс FormState содержит метод validate(). Когда вызывается метод validate(), он запускает функцию validator() для каждого текстового поля формы. Если все в порядке, то метод validate() возвращает значение true. Если какое-либо текстовое поле содержит ошибки, метод validate() перестраивает форму для отображения сообщений об ошибках и возвращает false.</p>

]]></content:encoded></item></channel></rss>