import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:test/config/app_theme.dart';
class LoginInfoFormField extends StatelessWidget {
const LoginInfoFormField(
{required this.controller,
required this.hintText,
required this.labelText,
this.validator,
this.onChanged,
this.inputFormatters,
this.focusNode,
this.enableSuggestions = true,
this.autocorrect = true,
this.obscureText = false,
this.suffixIcon,
super.key});
final TextEditingController? controller;
final String? Function(String?)? validator;
final void Function(String)? onChanged;
final List<TextInputFormatter>? inputFormatters;
final FocusNode? focusNode;
final String labelText;
final String hintText;
final bool enableSuggestions;
final bool autocorrect;
final bool obscureText;
final Widget? suffixIcon;
@override
Widget build(BuildContext context) {
print('Key: ${key.toString()}');
return Theme(
data: ThemeData(),
child: TextFormField(
key: key,
controller: controller,
focusNode: focusNode,
obscureText: obscureText,
validator: validator,
onChanged: onChanged,
enableSuggestions: enableSuggestions,
autocorrect: autocorrect,
inputFormatters: inputFormatters,
style: TextStyle(color: Theme.of(context).colorScheme.secondaryContainer),
decoration: InputDecoration(
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: AppTheme.grayColor)),
labelText: tr(labelText),
labelStyle: TextStyle(
fontSize: context.locale == const Locale('my', 'MM') ? 13 : 16,
color: Theme.of(context).colorScheme.secondaryContainer),
hintText: tr(hintText),
hintStyle: TextStyle(
fontSize: context.locale == const Locale('my', 'MM') ? 15 : 16,
),
suffixIcon: suffixIcon),
),
);
}
}
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:test/widgets/formfield/login_info_form_field.dart';
class Login extends StatefulWidget {
const Login({super.key});
@override
State<Login> createState() => _LoginState();
}
class _LoginState extends State<Login> {
final GlobalKey<FormFieldState> _userNameKey = GlobalKey<FormFieldState>();
final GlobalKey<FormFieldState> _emailKey = GlobalKey<FormFieldState>();
TextEditingController userNameController = TextEditingController();
TextEditingController emailController = TextEditingController();
@override
Widget build(BuildContext context) {
return Column(
children: [
Padding(
padding: const EdgeInsets.fromLTRB(32, 0, 32, 10),
child: LoginInfoFormField(
key: _userNameKey,
controller: userNameController,
validator: (value) {
if ((value!).trim().isEmpty) {
return tr('userNameRequired');
}
return null;
},
onChanged: (val) =>
_userNameKey.currentState!.validate(),
labelText: 'UserName',
hintText: 'UserName',
),
),
Padding(
padding: const EdgeInsets.fromLTRB(
32, 0, 32, 10),
child: LoginInfoFormField(
key: _emailKey,
validator: (value) {
if ((value!).trim().isEmpty) {
return tr('emailIsRequired');
}
return null;
},
onChanged: (val) {
_emailKey.currentState!.validate();
},
controller: emailController,
inputFormatters: [
FilteringTextInputFormatter
.singleLineFormatter
],
labelText: 'EnterYourEmail',
hintText: 'EnterYourEmail',
),
)
]
);
}
}
I am facing the error and don’t work validation.
Multiple widgets used the same GlobalKey.
The key [LabeledGlobalKey<FormFieldState<dynamic>>#c646e] was used by multiple widgets. The parents of those widgets were: – DefaultSelectionStyle – _FormScope A GlobalKey can only be specified on one widget at a time in the widget tree.