⚾
【Flutter】DropdownMenuFormField で Form バリデーションする
1. はじめに
DropdownMenu を Form と組み合わせて使いたい…そんなときに便利なのが DropdownMenuFormField です。
以下の PR でマージされました。ただし、現時点(2025-08-10)ではまだ stable に入っていません。(次のstableのマイナーバージョンアップで入るのでは?)
- PR: https://github.com/flutter/flutter/pull/163721
- API ドキュメント (main channel): https://main-api.flutter.dev/flutter/material/DropdownMenuFormField-class.html
2. サンプルコード(Form + バリデーション)
こちらのようなサンプル実装してみました。
必須選択の DropdownMenuFormField
を 2 つ(果物と色)配置し、validator
で未選択時にエラー表示、Submit 時に snackbar を出す例です。GlobalKey<FormFieldState<T>>
を使い、選択時に validate()
を走らせてその場でエラーを消しています。
3. 注意点: Form の reset ではクリアされない
DropdownMenu
は FormState.reset()
だけではクリアされません。関連 Issue は以下です。
そのため、上のサンプルでは以下を合わせて行っています。
-
FormState.reset()
を呼ぶ - 各
FormFieldState<T>
に対してreset()
を呼ぶ - 各
TextEditingController
をclear()
する -
setState
で保持している選択値をnull
に戻す
これで UI 上の表示と内部状態の両方をリセットできます。
4. おわりに
DropdownMenu は、Material 3 を意識した後発の Widget ですね。
DropdownMenuFormField が用意されたことで、DropdownMenu と Form を組み合わせたいときにも対応できるようになりました。
今後 stable へ反映されれば、Material 3 対応フォームの実装がより一貫したものになりそうですね。
5. 追記
Flutter 3.35.0 で入りましたね。
Discussion