body method
Defines the actual body code. path is passed relative to lib, baseName is the filename, and className is the filename converted to Pascal case.
実際の本体コードを定義します。pathにlibからの相対パス、baseNameにファイル名が渡され、classNameにファイル名をパスカルケースに変換した値が渡されます。
Implementation
@override
String body(String baseName, String className) {
var header = r"""
ユーザーによる入力や選択を受け取るために利用可能な`Widget`である`Form`の一覧とその利用方法を下記に記載する。
## `Form`とは
`Form`はユーザーによる入力や選択を受け取るためのクラスである。
- `Form`は`FormController`を通して`State`によって管理される。
- `FormController`中の`valudate()`メソッドを実行することで各`Form`の`validate`プロパティや`onSave`プロパティの処理を実行し入力・選択された値の検証や保存を行うことができる。
- `FormStyle`を適用することでデザインを統一することができる。
- `FormController`を渡さない使い方も可能。その場合は`onSaved`パラメーターではなく`onChanged`パラメーター等を利用する。
- 各種`Form`は型パラメーターが用意されていることが多いが、基本的に型パラメーターは明示的に指定しない。必須パラメーターを型有りで渡すことで自動的に型パラメーターが推論される。
- 例:この場合`FormEnumDropdownFieldPicker`の`values`に`UserType.values`を渡すことで`picker`が`FormEnumDropdownFieldPicker<UserType>`であるという推論が行われる。また`formController`が`FormController<UserValue>`の型であれば、`picker`の型と`form`の型により`FormEnumDropdownField<UserType, UserValue>`であるという推論が行われる。
```dart
FormEnumDropdownField(
form: formController,
initialValue: formController.value.type,
onSaved: (value) => formController.value.copyWith(type: value),
picker: FormEnumDropdownFieldPicker(
values: UserType.values,
labelBuilder: (value) {
return value.label;
},
),
)
```
## `Form`の一覧
| Class | Summary | Usage |
| --- | --- | --- |
""";
for (final entry in kFormList.entries) {
header +=
"| `${entry.key}` | ${entry.value.excerpt} | Usage(`documents/rules/form/${entry.key.toSnakeCase()}.md`) |\n";
}
header += """
## `FormStyle`について
`FormStyle`は`Form`のスタイルを定義するためのクラスである。これを各`Form`に適用することで、デザインを統一することができる。
```dart
final formStyle = FormStyle(
padding: EdgeInsets.all(16.0),
borderRadius: BorderRadius.all(Radius.circular(8.0)),
backgroundColor: Colors.grey[200],
);
```
### `FormInputBorderStyle`について
`FormInputBorderStyle`は`Form`の入力ボーダーのスタイルを定義するためのクラスである。これを各`FormStyle`で設定することで、入力ボーダーのスタイルを統一することができる。
```dart
final formStyle = FormStyle(
style: FormInputBorderStyle.outline,
);
```
種類は下記の通りである。
- `FormInputBorderStyle.none`: ボーダーなし。
- `FormInputBorderStyle.outline`: 外枠をすべて囲う。
- `FormInputBorderStyle.underline`: 下線のみ。
## `FormController`について
`FormController`は`Form`の状態を管理するためのクラスである。これを各`Form`に適用することで、`Form`の状態を管理することができる。`FormController`の取得は`Model`で定義された`form`メソッドを利用し`State`を通して取得する。
- `Model`の実装方法(`documents/rules/docs/model_usage.md`)
- `State`の利用方法(`documents/rules/docs/state_usage.md`)
```dart
final formController = ref.page.form(AnyModel.form(AnyModel()));
```
既存の値を編集する際に`Document`の`Model`を既存の値として利用する場合は下記のように定義する。
```dart
final anyDocument = ref.app.model(AnyModel.document(documentId))..load();
final formController = ref.page.form(
AnyModel.form(
anyDocument.value ?? AnyModel(),
),
);
```
`FormController`を各`Form`に適用する際には各`Form`の`form`パラメーターに`FormController`を渡す。
また`form`パラメーターに`FormController`を渡す際には`onSaved`パラメーターを定義する必要がある。
`onSaved`パラメーターには`FormController`の`value`の`copyWith`メソッドを利用して`FormController`の`value`を更新し、`onSaved`の戻り値にその値をそのまま返す。
```dart
FormTextField(
form: formController,
onSaved: (value) => formController.value.copyWith(
title: value,
),
);
```
`FormController`の`validate()`メソッドを実行することで各`Form`の`validate`プロパティや`onSave`プロパティの処理を実行し入力・選択された値の検証や保存を行うことができる。
```dart
final value = formController.validate();
if(value == null){
// 入力された値が検証に通らなかった場合の処理
} else {
// 入力された値が検証に通った場合の処理
}
```
""";
return header;
}