この記事はこんな人におすすめ!
- Flutterで入力フォームにバリデーションを実装したい
- TextFormFieldの使い方が知りたい
「Flutterでバリデーション付きの入力フォームを実装するにはどうするの?」
今回はFlutterでバリデーション付きの入力フォームを実装できるTextFormField
の使い方について解説していきます。本記事の内容はFluter公式のCookbookの手順を参考にしています。
目次
TextFormFieldとは?
TextFormField
はバリデーションチェックを行える入力フォームを実装できるウィジェットです。
ステップ1:FormとGlobalKeyを連携させる
それではTextFormField
の使い方を紹介していきます。
StatefulWidget
でGlobalKey
を定数として定義し、Form
のkey
の引数としてGlobalKey
を渡します。
今回は_formKey
でGlobalKey
を定義しています。
class _MyHomePageState extends State<MyHomePage> {
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Form(
key: _formKey,
child: ...
);
}
}
ステップ2:TextFormFieldとバリデーションを作成
Form
内でTextFormField
を作成しvalidator
で次のようにバリデーションの処理を指定できます。
バリデーションを実行しエラーが発生した場合のエラー文をString型でreturn
で指定し、問題がなかった場合はreturn
でnull
を返すようにします。
TextFormField(
validator: (value) {
if (value == null || value.isEmpty) {
return '文字を入力をしてください';
}
return null;
},
),
ステップ3:入力フォームで入力した値を取得
先ほどTextFormField
で作成したバリデーションを実行するには_formKey.currentState!.validate()
を呼び出します。_formKey.currentState!.validate()
が実行されるとバリデーションを行いエラーが出た場合はfalse
を返し、問題がない場合はtrue
を返します。
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('文字が入力されています')),
);
}
},
child: const Text('入力チェック'),
),
サンプルコード
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Flutter')),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Form(
key: _formKey,
child: Column(
children: [
TextFormField(
validator: (value) {
if (value == null || value.isEmpty) {
return '文字を入力をしてください';
}
return null;
},
),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('文字が入力されています')),
);
}
},
child: const Text('入力チェック'),
),
],
),
);
}
}
まとめ
今回はTextFormField
を使用して入力フォームを実装する方法を紹介します。TextFormField
に似たTextField
もあるのでぜひ一緒にチェックしてみてください。