個人開発者が勉強がてらまとめているだけのサイトです

入力エラー表示(バリデーション) Form Validation

入力が間違っていると、欄が赤くなって下に理由が出る。直すとその場で消える。

別名
バリデーション入力チェックエラーメッセージ必須入力入力ミスの表示赤い枠FormTextFormFieldValidator
動き
間違えると赤い枠と説明が出る直すと消える
作り方
標準ウィジェット Flutter に入っているものだけで作れます

本物の Flutter ウィジェットが動きます(初回は数秒かかります)

別タブで大きく開く ↗

どんなもの?

Form で入力欄をまとめ、各 TextFormField の validator にチェックを書きます。

validator は問題があればエラー文を返し、なければ null を返します。返した文が欄の下に赤く出ます。

送信ボタンでは formKey.currentState!.validate() を呼び、全部 null のときだけ先へ進めます。

各欄に autovalidateMode: AutovalidateMode.onUserInteraction を付けると、一度触った欄は打つたびにチェックされ、直した瞬間にエラーが消えます。

同じ設定を Form 側に付けると、1つの欄を触っただけで、まだ触っていない欄まで「入力してください」と赤くなるので注意します。

エラー文は「入力が正しくありません」ではなく「@ が入っていません」のように直し方が分かる言葉にします。

こんなときに

  • 会員登録・お問い合わせなど、送る前に入力の形を確かめたいフォーム

避けたい場面

  • 1文字目を打った瞬間からエラーを出す(まだ打っている途中なので、触り終えてから出す)

最小コード

final formKey = GlobalKey<FormState>();

Form(
  key: formKey,
  child: Column(children: [
    TextFormField(
      // 触った欄だけ、打つたびにチェック(Form 側に付けると未入力の欄まで赤くなる)
      autovalidateMode: AutovalidateMode.onUserInteraction,
      decoration: const InputDecoration(labelText: 'メールアドレス'),
      validator: (v) {
        if (v == null || v.isEmpty) return '入力してください';
        if (!v.contains('@')) return '@ が入っていません';
        return null; // 問題なし
      },
    ),
    FilledButton(
      onPressed: () {
        if (formKey.currentState!.validate()) submit();
      },
      child: const Text('登録する'),
    ),
  ]),
)

使うウィジェット

FormTextFormField(validator)AutovalidateModeGlobalKey<FormState>

似ているもの・一緒に見たいもの

触ってみる ↗
入力・フォーム テキスト入力の種類Text Field Styles

文字を打つ欄の見た目は「枠線」「塗り」「下線」の3種類。押すと中のラベルが上へ縮んで、枠の色が変わる。

押すとラベルが上へ縮む
触ってみる ↗
入力・フォーム 文字数カウンターCharacter Counter

入力欄の右下に「12 / 140」のように打った文字数が出る。上限に近づくと色が変わり、それ以上は打てない。

打つと数字が増える
触ってみる ↗
入力・フォーム ログイン画面Login Screen

メールとパスワードを入れてログインする画面。新規登録との切り替えや、Google などでのログインボタンも並ぶ。

ログインと新規登録を切り替え