Tinyrack

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_ui
import '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型 / デフォルト用途
childWidget (required)フォームフィールドを含むサブツリーです。
autovalidateModeAutovalidateMode?ネイティブフォームが再検証するタイミングを決めます。null の場合は明示的に呼んだときだけ検証します。
onChangedValueChanged<TRFormValues>?フィールドの変更後と reset() の後に、新しいスナップショットとともに呼ばれます。
canPopbool?未保存の入力があるときのルート pop を制御するため、ネイティブの Form に渡されます。
onPopInvokedWithResultPopInvokedWithResultCallback<Object?>?ネイティブの Form に渡され、pop の試行後に呼ばれます。

TRFormState のメンバー

Prop型 / デフォルト用途
valuesTRFormValuessave() を実行せずに取得する、有効な名前付きフィールドのスナップショットです。
save()TRFormValuesFormState.save() を実行し、その結果のスナップショットを返します。
validate()boolすべてのフィールド検証を実行し、すべて通ったかどうかを返します。
validateGranularly()boolネイティブの詳細な検証 API で検証し、エラーを報告したフィールドがなければ true を返します。
reset()voidネイティブのフィールド値を戻し、新しいスナップショットで onChanged を呼びます。
TRForm.maybeOfTRFormState? Function(BuildContext)子孫ウィジェットから外側のフォーム状態を探し、TRForm の外では null を返します。

TRFormValues のメンバー

Prop型 / デフォルト用途
operator []Object? Function(String name)名前でフィールド値を 1 つ読み取り、その名前がなければ null を返します。
containsbool Function(String name)スナップショットがその名前を持つかどうかを示します。無効なフィールドは表示されていても含まれません。
entriesIterable<MapEntry<String, Object?>>収集した名前と値の組を反復します。
toMap()Map<String, Object?>エンコードや送信のために、スナップショットを通常のマップへコピーします。