Flutter

Flutter Formの使い方|TextFormFieldとバリデーションで入力検証

FlutterのFormを初心者向けに解説します。GlobalKeyとTextFormField、validatorによる未入力・文字数・メール形式のバリデーション、validate/saveで複数入力をまとめて検証・保存する流れを整理します。

この記事の目次
  1. この記事の結論
  2. Formの基本構造
  3. TextFormFieldとvalidatorで入力チェック
  4. よく使うバリデーションの型
  5. 送信時に検証して保存する
  6. 実装後に確認すること
  7. よくあるつまずき
  8. 次に読む記事
  9. まとめ

FlutterのFormは、複数の入力欄をまとめて検証・保存するためのWidgetです。ログイン、お問い合わせ、会員登録など「入力→チェック→送信」の画面はほぼFormとTextFormFieldで組み立てます。

この記事の結論

GlobalKey<FormState>でFormの状態を握り、各入力欄をTextFormFieldにしてvalidatorを書き、送信ボタンでvalidate()すれば動きます。まずは未入力・文字数・メール形式の3つのバリデーションを押さえれば実用になります。

Formの基本構造

Formには状態にアクセスするためのGlobalKeyを渡します。中の入力欄はColumnなどで並べます。

final formKey = GlobalKey<FormState>();

Form(
  key: formKey,
  child: Column(
    children: [
      TextFormField(decoration: const InputDecoration(labelText: "名前")),
      TextFormField(decoration: const InputDecoration(labelText: "メール")),
    ],
  ),
)

TextFormFieldとvalidatorで入力チェック

TextFormFieldは、Formと組み合わせて検証しやすくしたTextFieldです。validatorはエラー時にメッセージ文字列を、問題なければnullを返します。

TextFormField(
  decoration: const InputDecoration(labelText: "メール"),
  validator: (value) {
    if (value == null || value.trim().isEmpty) {
      return "入力してください";
    }
    if (!value.contains("@")) {
      return "メールアドレスの形式で入力してください";
    }
    return null;
  },
)

よく使うバリデーションの型

未入力・文字数・形式の3パターンを関数に切り出しておくと、複数の入力欄で使い回せます。

String? requiredText(String? value) {
  if (value == null || value.trim().isEmpty) return "入力してください";
  return null;
}

String? minLength(String? value) {
  if (value == null || value.length < 8) return "8文字以上で入力してください";
  return null;
}

送信時に検証して保存する

ボタン押下時にvalidate()を呼び、全入力欄がOKならsave()でonSavedを実行して値を確定します。

String email = "";

ElevatedButton(
  onPressed: () {
    if (formKey.currentState!.validate()) {
      formKey.currentState!.save();
      // ここでAPI送信などへ進む
    }
  },
  child: const Text("送信"),
);

TextFormField(
  onSaved: (value) {
    email = value ?? "";
  },
)

実装後に確認すること

  • 未入力・不正な形式のときにエラーメッセージが表示されるか確認したか
  • 送信ボタンでvalidate()が全入力欄をチェックしているか確認したか
  • 入力値の取得をonSavedとControllerのどちらで行うか整理したか
  • 小さい画面でキーボード表示時にレイアウトが崩れないか確認したか

よくあるつまずき

  • FormにGlobalKeyを渡し忘れてvalidate()が呼べない
  • TextFieldのまま使いvalidatorが書けずに困る(Form内はTextFormField)
  • validatorでnullを返し忘れ、常にエラー扱いになる
  • save()を呼ばずonSavedの値が反映されない

次に読む記事

まとめ

Flutter Formの使い方は、GlobalKey・TextFormField・validator・validate/saveの4点で理解できます。未入力・文字数・形式の基本バリデーションを小さく試し、送信処理や画面遷移へつなげましょう。