我创建了一个 TextFormField,我想验证它。通过验证,我想从 Firestore 获取数据,并且如果 TextFormField 中的输入值存在于 Firestore 数据库中,则应返回“Exists”,否则返回 null。我不知道我做的是否正确,但在输入值后,即使该值存在,它也不会返回任何内容。请帮忙
class GenerateUID extends StatefulWidget {
final String idAreadyExistsString;
final String noSPacesAllowedString;
final String fieldCannotBeEmptyString;
const GenerateUID(
{super.key,
required this.idAreadyExistsString,
required this.noSPacesAllowedString,
required this.fieldCannotBeEmptyString});
@override
State<GenerateUID> createState() => _GenerateUIDState();
}
class _GenerateUIDState extends State<GenerateUID> {
TextEditingController employeeIDController = TextEditingController();
final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Form(
key: _formkey,
child: TextFormField(
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp("[0-9]")),
LengthLimitingTextInputFormatter(10)
],
controller: employeeIDController,
style: const TextStyle(
color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20),
onChanged: (value) {
_formkey.currentState?.validate();
},
validator: (value) {
FirebaseFirestore.instance
.collection("ADMIN IDS")
.where("ID", isEqualTo: value)
.get()
.then((valuess) {
if (valuess.docs.isNotEmpty) {
return widget.idAreadyExistsString;
}
});
if (value!.contains(" ")) {
return (widget.noSPacesAllowedString);
}
if (value.isEmpty) {
return (widget.fieldCannotBeEmptyString);
}
return null;
},
),
)),
);
}
}
首先,我很着急。 我已经用伪代码解释了我的解决方案,你需要根据这个想法编写你的代码。
这里
class MyApp extends StatefulWidget{
List<String> ids = [];
MyApp({super.key});
void initState(){
super.initState();
initiateIdsList();
}
void initiateIdsList()async{
// initialize your list here, refactor the following pseudo code
await FirebaseFirestore.instance
.collection("ADMIN IDS").get().then((v){
v.forEach(e){
ids.add(e);
}
});
}
@override
Widget build(BuildContext context) {
YourTFF(
validator: (value){
if (value!.contains(" ")) {
return (widget.noSPacesAllowedString);
}
if (value.isEmpty) {
return (widget.fieldCannotBeEmptyString);
}
if(ids.contains(value)){
print('already exist');
}
return null;
}
);
}
}
这是因为我们无法将验证器回调标记为异步函数。
希望对您有帮助。