Flutter

Flutter TextFieldの使い方|入力値の取得・Controller・キーボード種別

Flutter TextFieldの使い方を初心者向けに解説します。InputDecorationでの表示、onChangedとTextEditingControllerによる入力値の取得、disposeでの解放、keyboardTypeでのキーボード切り替えまでを整理します。

この記事の目次
  1. この記事の結論
  2. 最小のTextField
  3. onChangedで入力値を受け取る
  4. TextEditingControllerで値を読む
  5. Controllerは必ずdisposeする
  6. キーボード種別を変える
  7. 実装後に確認すること
  8. よくあるつまずき
  9. 次に読む記事
  10. まとめ

TextFieldは、ユーザーに文字を入力してもらうための基本Widgetです。検索欄やメモ入力など、Flutterの画面で最もよく使う入力部品です。入力値の受け取り方には、その場で受け取るonChangedと、あとでまとめて読むTextEditingControllerの2通りがあります。

この記事の結論

表示だけならTextFieldとInputDecoration、入力のたびに値が欲しいならonChanged、送信時にまとめて読みたいならTextEditingControllerを使います。Controllerを使ったら必ずdisposeで解放します。

最小のTextField

InputDecorationでラベルやヒントを付けた入力欄を表示します。

TextField(
  decoration: const InputDecoration(
    labelText: "名前",
    hintText: "山田太郎",
  ),
)

onChangedで入力値を受け取る

入力のたびに値が渡されます。検索欄のように打ち込みながら反応させたい場合に向きます。

String keyword = "";

TextField(
  onChanged: (value) {
    keyword = value;
  },
)

TextEditingControllerで値を読む

送信ボタンを押したときにまとめて値を読みたい場合や、初期値を入れたい場合はControllerを使います。StatefulWidgetのStateに持たせ、textプロパティで現在の入力値を取得します。

final controller = TextEditingController(text: "初期値");

TextField(controller: controller);

// 送信時などに読む
print(controller.text);

Controllerは必ずdisposeする

Controllerはメモリを確保するため、画面が破棄されるタイミングで解放しないとリークします。Stateのdisposeでcontrollerをdisposeします。

@override
void dispose() {
  controller.dispose();
  super.dispose();
}

キーボード種別を変える

メールや数値の入力ではkeyboardTypeを指定すると、適切なキーボードが表示され入力ミスが減ります。

TextField(
  keyboardType: TextInputType.emailAddress,
  decoration: const InputDecoration(labelText: "メール"),
)

実装後に確認すること

  • 入力値の取得をonChangedとControllerのどちらで行うか決めたか
  • Controllerを使った場合にdisposeを書いたか
  • メールや数値でkeyboardTypeを指定したか
  • 入力チェックが必要ならFormとTextFormFieldに移行する判断をしたか

よくあるつまずき

  • Controllerのdispose忘れでメモリリークや警告が出る
  • onChangedとControllerを二重に使い、値の管理が分散する
  • StatelessWidgetにControllerを置いて再生成されてしまう
  • 入力チェックが必要なのにTextFieldのまま作り込む(Form向きはTextFormField)

次に読む記事

まとめ

Flutter TextFieldの使い方は、表示・onChanged・Controllerの3点で整理できます。値をいつ読むかで手段を選び、Controllerを使ったらdisposeを忘れずに。入力チェックが必要になったらFormとTextFormFieldへ進みましょう。