使用 Firestore 进行 Flutter TextFormField 验证

问题描述 投票:0回答:1

我创建了一个 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;
          },
        ),
      )),
    );
  }
}
flutter validation google-cloud-firestore
1个回答
0
投票

首先,我很着急。 我已经用伪代码解释了我的解决方案,你需要根据这个想法编写你的代码。

这里

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;
      }
    );
  }

}

这是因为我们无法将验证器回调标记为异步函数。

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.