6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flutterのフォーム入力にはFlutter FormBuilderがオススメ

Last updated at Posted at 2021-04-03

初めに

に関するTipsです。

本題

Flutter初心者として、Flutterでフォーム入力を実装する際に困りました。
公式のドキュメントはこのようになっていますが、

今更emailバリデーションなど自分で実装したく無いしと感じ、
Submitエラーなど非同期のエラーをどのように反映するかも分かりませんでした。

Reactでいうredux-formやformikのような物が無いか色々なライブラリを検証した所、
「Flutter FormBuilder」が最高でした。日本語の記事を見かけなかったので紹介します。

公式のドキュメントにもある通り、通常のバリデーションは

             validator: FormBuilderValidators.compose([
                FormBuilderValidators.required(context),
                FormBuilderValidators.numeric(context),
                FormBuilderValidators.max(context, 70),
              ]),

をフィールドにセットするだけです。
必要なバリデーションが用意されているので嬉しいですね。

ただ、非同期のエラーを簡単に扱うのには少しコツがいるようです。

Submitエラーの扱い方

サンプルの実装はこちらをご覧ください。

共通コンポーネント

  • validate_form_state.dart
  • validate_text_field.dart

※「atomicデザイン採用したいようだけど、間違っていない?」と思った方、勉強中ですのでご了承ください。

各画面の実装

ポイント

非同期エラーの反映は公式では、このようになっています。

が、私が実装したかった仕様にはマッチしませんでした。

  1. フォームを再度入力した際に入力した項目の非同期エラーをリセットする。
  2. 登録ボタンが押された際に、全ての非同期エラーを一旦リセットする。

を実現したかったのですが、
「登録ボタンが押された際に、全ての非同期エラーを一旦リセットする」という部分について、
公式の実装方法ではうまく行きませんでした。

バリデーション処理でerrorTextが設定されている場合、バリエーションが通らないように
ライブラリ側で制御されています。

登録ボタン押下時にエラーをリセットし、バリデーションを再度実行するのですが、
widget内のerrorTextのリセットが同期されない(する方法が分からない)為、errorTextが残った状態になり、
1回目の登録ボタン押下ではバリデーションがエラー判定になってしまいました。(2回目は問題無い。)

そこで、errorTextを使わずに独自バリデーション処理を追加することでこの問題を解決しています。
以下、具体的な実装箇所になります。

アプリの挙動は、こんな感じになります。

Apr-04-2021 00-59-36.gif

以上、よろしくお願い致します。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?