💭

【Flutter】FormField の validator で扱う値がなぜか一文字分ズレる現象の解決

2023/02/01に公開

前提

個人のただのメモ

本編

場面

Flutter で DDD に従い Validation 機能を自身で内包した Value Object を作成し、それを用いて Form(autovalidationMode: .onUserInteraction) 直下の TextFormField で Riverpod の stateNotifierProvider を用いて onChanged と validator でバリデーションを実装しようとした。

エラー

onChanged で更新した state でなく その変更前の state がなぜか validator で使われ、バリデーションが一文字分ワンステップいつも遅れるという謎の現象が起きた。

validator: ref.watch(signInFormStateProvider).emailAddress.value_.fold(
            (f) => f.maybeMap(
              invalidEmail: (_) => (_) => 'Invalid Email',
              orElse: () => (_) => null,
            ),
            (_) => (_) => null,
          ),

解決

上では、エラーは起きないが、最初に引数を取らない形がこのズレを生じていたらしい。
以下に直したら、解決した。

validator: (_) => ref.watch(signInFormStateProvider).emailAddress.value_.fold(
            (f) => f.maybeMap(
              invalidEmail: (_) => 'Invalid Email',
              orElse: () => null,
            ),
            (_) => null,
          ),

おわりに

以上、個人のメモでした。
参考になりましたら幸いです。
初心者ゆえ、ご指摘、アドバイス等ございましたら、是非ともよろしくお願いいたします。

Discussion