Form
Flutter のフォームフィールドを検証し、有効な Tinyrack の名前付き値をまとめて取得します。
Flutter のフォームフィールドを検証し、有効な Tinyrack の名前付き値をまとめて取得します。
主なプロパティ
| プロパティ | 説明 |
|---|---|
| 値の収集 | values は名前付きフィールドの不変な TRFormValues スナップショットを返し、save() はネイティブの FormState.save() を実行してから同じスナップショットを返します。 |
| 無効フィールドと読み取り専用フィールド | enabled: false のフィールドは TRFormValues から除外されます。readOnly: true のフィールドは値をそのまま含みます。 |
| 検証 | validate() はすべてのフィールド検証が通ったかどうかを返します。validateGranularly() はネイティブの詳細な検証を実行し、エラー集合が空のとき true を返します。集合そのものは公開されません。フォームにまだ FormState がない場合、どちらも true を返します。 |
| 検証のタイミング | autovalidateMode の既定値は null のため、検証を実行したときにだけエラーが表示されます。入力中に検証するには AutovalidateMode.onUserInteraction を渡してください。 |
| 変更とリセット | フィールドが変わるたびに onChanged が新しいスナップショットとともに呼ばれます。reset() はネイティブのフィールド値を戻してから onChanged を再び呼びます。送信結果などのアプリケーション状態は別途クリアしてください。 |
TRFormState には、保持している GlobalKey<TRFormState> か、子孫ウィジェットからの TRForm.maybeOf(context) でアクセスしてください。TRFormValues に含まれるのは name を宣言したフィールドだけです。
インストール
パッケージを追加し、公開ライブラリをインポートしてください。
flutter pub add tinyrack_uiimport 'package:tinyrack_ui/tinyrack_ui.dart';プレイグラウンド
使用方法
import 'package:material_ui/material_ui.dart';
import 'package:tinyrack_ui/tinyrack_ui.dart';
class RackForm extends StatefulWidget {
const RackForm({super.key});
@override
State<RackForm> createState() => _RackFormState();
}
class _RackFormState extends State<RackForm> {
final GlobalKey<TRFormState> formKey = GlobalKey<TRFormState>();
String submitted = '';
@override
Widget build(BuildContext context) => TRForm(
key: formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
spacing: TRSpacing.medium,
children: [
TRTextField(
name: 'rack',
label: 'ラック名',
validator: (value) =>
(value ?? '').trim().isEmpty ? 'ラック名を入力してください。' : null,
),
TRButton(
onPressed: () {
final state = formKey.currentState!;
if (!state.validate()) return;
final values = state.save();
setState(() => submitted = values['rack']?.toString() ?? '');
},
child: const Text('保存'),
),
if (submitted.isNotEmpty)
TRText(submitted, variant: TRTextVariant.bodySm),
],
),
);
}例
値の収集とリセット パーマリンク
送信では `save()` を通じて名前付きフィールドを読み取ります。リセットは初期値を戻し、送信結果はアプリケーション側でクリアします。
必須送信と復旧 パーマリンク
空のまま送信すると検証メッセージが表示されます。ラック名を入力して再送信してください。`validate()` が `save()` の読み取りを制御します。
サーバーエラーと復旧 パーマリンク
拒否された名前は検証関数ではなく `errorText` として戻ります。編集中は `onChanged` がエラーを消し、`reset()` はフィールドを戻します。結果はアプリケーション側でクリアします。
ライブスナップショットと詳細な検証 パーマリンク
入力すると `onChanged` がスナップショットを報告します。無効なリージョンフィールドは `TRFormValues` に含まれず、`validateGranularly()` は送信を発生させずに検証します。
API
TRForm のプロパティ
| Prop | 型 / デフォルト | 用途 |
|---|---|---|
child | Widget (required) | フォームフィールドを含むサブツリーです。 |
autovalidateMode | AutovalidateMode? | ネイティブフォームが再検証するタイミングを決めます。null の場合は明示的に呼んだときだけ検証します。 |
onChanged | ValueChanged<TRFormValues>? | フィールドの変更後と reset() の後に、新しいスナップショットとともに呼ばれます。 |
canPop | bool? | 未保存の入力があるときのルート pop を制御するため、ネイティブの Form に渡されます。 |
onPopInvokedWithResult | PopInvokedWithResultCallback<Object?>? | ネイティブの Form に渡され、pop の試行後に呼ばれます。 |
TRFormState のメンバー
| Prop | 型 / デフォルト | 用途 |
|---|---|---|
values | TRFormValues | save() を実行せずに取得する、有効な名前付きフィールドのスナップショットです。 |
save() | TRFormValues | FormState.save() を実行し、その結果のスナップショットを返します。 |
validate() | bool | すべてのフィールド検証を実行し、すべて通ったかどうかを返します。 |
validateGranularly() | bool | ネイティブの詳細な検証 API で検証し、エラーを報告したフィールドがなければ true を返します。 |
reset() | void | ネイティブのフィールド値を戻し、新しいスナップショットで onChanged を呼びます。 |
TRForm.maybeOf | TRFormState? Function(BuildContext) | 子孫ウィジェットから外側のフォーム状態を探し、TRForm の外では null を返します。 |
TRFormValues のメンバー
| Prop | 型 / デフォルト | 用途 |
|---|---|---|
operator [] | Object? Function(String name) | 名前でフィールド値を 1 つ読み取り、その名前がなければ null を返します。 |
contains | bool Function(String name) | スナップショットがその名前を持つかどうかを示します。無効なフィールドは表示されていても含まれません。 |
entries | Iterable<MapEntry<String, Object?>> | 収集した名前と値の組を反復します。 |
toMap() | Map<String, Object?> | エンコードや送信のために、スナップショットを通常のマップへコピーします。 |