新規登録やログインなどで汎用的に使えるようにしておきたいな、と思ったのでメールアドレス入力用のTextFieldウィジェットを作ってみました。
flutter doctor 実行環境
[✓] Flutter (Channel stable, 3.3.10, on macOS 13.1 22C65 darwin-x64, locale ja-JP)
[✓] Android toolchain – develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode – develop for iOS and macOS (Xcode 14.2)
[✓] Chrome – develop for the web
[✓] Android Studio (version 2020.3)
[✓] VS Code (version 1.74.3)
Email入力用のTextFieldを作る
EmailTextField コード全文
import 'package:flutter/material.dart';
class EmailTextField extends StatelessWidget {
final TextEditingController controller;
final TextInputAction? textInputAction;
final void Function(String)? onChanged;
final void Function(String)? onSubmitted;
final void Function(bool)? onFocusChange;
const EmailTextField({
super.key,
required this.controller,
this.textInputAction,
this.onChanged,
this.onSubmitted,
this.onFocusChange,
});
@override
Widget build(BuildContext context) {
return Focus(
onFocusChange: onFocusChange,
child: TextField(
controller: controller,
decoration: const InputDecoration(
labelText: 'メールアドレス',
hintText: 'mail@example.com',
),
keyboardType: TextInputType.emailAddress,
textInputAction: textInputAction,
onChanged: onChanged,
onSubmitted: onSubmitted,
),
);
}
}
EmailTextFieldの引数
final TextEditingController controller;
- コントローラーは外部(Pageなど)から渡してもらう想定で作っています。
final TextInputAction? textInputAction;
- 必須ではないですが、確定ボタンを押した時にパスワード入力などにフォーカスを移したい時はTextInputAction.nextを指定したりすると良いと思います。
final void Function(String)? onChanged;
- 入力変更検知用に用意しています。入力する度にバリデーションしたい場合などに使うと良いと思います。
final void Function(String)? onSubmitted;
- 入力確定の検知用です。こちらもバリデーションなどに使えるでしょう。
final void Function(bool)? onFocusChange;
- フォーカスされた時や外れた時の検知用です。
中身のTextField
decoration: const InputDecoration
- タイトルラベルとヒントテキスト(プレースホルダー)は固定にしていますが引数をとっても良いかと思います。
keyboardType: TextInputType.emailAddress
- ソフトウェアキーボードがメールアドレス入力用になります。
使い方
Pageに設置した時の例です(実際は他のWidgetと組み合わせると思いますがここでは簡略化しています)。
class SignUpPage extends StatelessWidget {
final _emailController = TextEditingController();
@override
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
body: EmailTextField(
controller: _emailController,
textInputAction: TextInputAction.next,
onChanged: (value) {
_validate(value);
},
onFocusChange: (hasFocus) {
if (!hasFocus) {
フォーカスが外れた時...
}
},
),
);
}
void _validate(String email) {
何かバリデーションを行ったりする...
}
}