Dart/Flutter Как сделать проверку данных для Firebase

Как сделать проверку на уже существующего пользователя в базе данных Firebase? При нажатии кнопки Регистрация, всегда создается такой же пользователь с идентичными данными. Не знаю как сделать проверку в методе validateForm; Искал в интернете в похожих приложениях, но они уже не работаеют((

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';

enum SingingCharacter { Male, Femaly }

class SignUp extends StatefulWidget {
  const SignUp({Key? key}) : super(key: key);


  @override
  State<SignUp> createState() => _SignUpState();
}

class _SignUpState extends State<SignUp> {
  final databaseRef = FirebaseDatabase.instance.ref("users");
  final _formKey = GlobalKey<FormState>();
  FirebaseAuth _auth = FirebaseAuth.instance;
  TextEditingController _emailTextController = new TextEditingController();
  TextEditingController _passwordTextController = new TextEditingController();
  TextEditingController _nameTextController = new TextEditingController();
  TextEditingController _confirmPasswordController =
      new TextEditingController();

  bool loading = false;
  bool emailExists = false;
  bool hidePass = true;
  SingingCharacter? _character = SingingCharacter.Male;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          Image.asset(
            'images/moda.jpeg',
            fit: BoxFit.cover,
            height: double.infinity,
            width: double.infinity,
            alignment: Alignment.center,
          ),
          Container(
            color: Colors.black.withOpacity(0.4),
            width: double.infinity,
            height: double.infinity,
          ),
          Padding(
            padding: const EdgeInsets.only(top: 200.0),
            child: Container(
              alignment: Alignment.center,
              child: Center(
                child: Form(
                    key: _formKey,
                    child: ListView(
                      children: <Widget>[
                        Padding(
                          padding: const EdgeInsets.only(
                              top: 8.0, left: 10.0, right: 10.0),
                          child: Material(
                            borderRadius: BorderRadius.circular(25.0),
                            color: Colors.white.withOpacity(0.7),
                            elevation: 0.0,
                            child: Padding(
                              padding: const EdgeInsets.only(left: 4.0),
                              child: TextFormField(
                                controller: _nameTextController,
                                decoration: InputDecoration(
                                  hintText: "Ф.И.О.",
                                  icon: Padding(
                                    padding: const EdgeInsets.only(left: 10.0),
                                    child: Icon(Icons.person_outline),
                                  ),
                                  border: InputBorder.none,
                                ),
                                validator: (String? value) {
                                  if (value != null && value.isEmpty) {
                                    return "Поле имя не может быть пустым";
                                  }
                                  return null;
                                },
                              ),
                            ),
                          ),
                        ),

                        Padding(
                          padding:
                              const EdgeInsets.fromLTRB(14.0, 8.0, 14.0, 8.0),
                          child: Material(
                            borderRadius: BorderRadius.circular(25.0),
                            color: Colors.white.withOpacity(0.7),
                            elevation: 0.0,
                            child: Padding(
                              padding: const EdgeInsets.only(left: 4.0),
                              child: TextFormField(
                                controller: _emailTextController,
                                decoration: InputDecoration(
                                  hintText: "E-mail",
                                  icon: Padding(
                                    padding: const EdgeInsets.only(left: 10.0),
                                    child: Icon(Icons.alternate_email),
                                  ),
                                  border: InputBorder.none,
                                ),
                                validator: (val) {
                                  if (RegExp(
                                        r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$',
                                      ).hasMatch(val!) &&
                                      !emailExists) {
                                    return null;
                                  } else {
                                    if (emailExists == true) {
                                      return "Email already exists, please sign in";
                                    } else {
                                      return "Please provide a valid email";
                                    }
                                  }
                                },
                              ),
                            ),
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: Column(
                            children: <Widget>[
                              ListTile(
                                title: const Text(
                                  'Муж',
                                  style: TextStyle(color: Colors.white),
                                ),
                                leading: Radio<SingingCharacter>(
                                  value: SingingCharacter.Male,
                                  groupValue: _character,
                                  onChanged: (SingingCharacter? value) {
                                    setState(() {
                                      _character = value;
                                      if (value == SingingCharacter.Male) {
                                        _character = value;
                                      }
                                    });
                                  },
                                ),
                              ),
                              ListTile(
                                title: const Text(
                                  'Жен',
                                  style: TextStyle(color: Colors.white),
                                ),
                                leading: Radio<SingingCharacter>(
                                  value: SingingCharacter.Femaly,
                                  groupValue: _character,
                                  onChanged: (SingingCharacter? value) {
                                    setState(() {
                                      _character = value;
                                      if (value == SingingCharacter.Femaly) {
                                        _character = value;}
                                    });
                                  },
                                ),
                              ),
                            ],
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(
                              top: 8.0, left: 10.0, right: 10.0),
                          child: Material(
                            borderRadius: BorderRadius.circular(25.0),
                            color: Colors.white.withOpacity(0.7),
                            elevation: 0.0,
                            child: Padding(
                              padding: const EdgeInsets.only(left: 4.0),
                              child: ListTile(
                                title: TextFormField(
                                  controller: _passwordTextController,
                                  obscureText: hidePass,
                                  decoration: InputDecoration(
                                    hintText: "Пароль",
                                    icon: Padding(
                                      padding:
                                          const EdgeInsets.only(left: 10.0),
                                      child: Icon(Icons.lock_outline),
                                    ),
                                    border: InputBorder.none,
                                  ),
                                  validator: (String? value) {
                                    if (value != null && value.isEmpty) {
                                      return "Поле пароля не может быть пустым";
                                    } else if (value!.length < 6) {
                                      return "Пароль должен быть не менее 6 символов";
                                    }
                                    return null;
                                  },
                                ),
                                trailing: IconButton(
                                    onPressed: () {
                                      setState(() {
                                        hidePass = false;
                                      });
                                    },
                                    icon: Icon(Icons.remove_red_eye)),
                              ),
                            ),
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.only(
                              top: 8.0, left: 10.0, right: 10.0),
                          child: Material(
                            borderRadius: BorderRadius.circular(25.0),
                            color: Colors.white.withOpacity(0.7),
                            elevation: 0.0,
                            child: Padding(
                              padding: const EdgeInsets.only(left: 4.0),
                              child: ListTile(
                                title: TextFormField(
                                  controller: _confirmPasswordController,
                                  obscureText: hidePass,
                                  decoration: InputDecoration(
                                    hintText: "Подтвердите пароль",
                                    icon: Padding(
                                      padding:
                                          const EdgeInsets.only(left: 10.0),
                                      child: Icon(Icons.lock_outline),
                                    ),
                                    border: InputBorder.none,
                                  ),
                                  validator: (String? value) {
                                    if (value != null && value.isEmpty) {
                                      return "Поле пароля не может быть пустым";
                                    } else if (value!.length < 6) {
                                      return "Пароль должен быть не менее 6 символов";
                                    } else if (_passwordTextController.text !=
                                        value) {
                                      return "Пароли не совпадают";
                                    }
                                    return null;
                                  },
                                ),
                                trailing: IconButton(
                                    onPressed: () {
                                      setState(() {
                                        hidePass = false;
                                      });
                                    },
                                    icon: Icon(Icons.remove_red_eye)),
                              ),
                            ),
                          ),
                        ),
                        Padding(
                          padding:
                              const EdgeInsets.fromLTRB(14.0, 15.0, 14.0, 8.0),
                          child: Material(
                            borderRadius: BorderRadius.circular(20.0),
                            color: Colors.red,
                            elevation: 0.0,
                            child: MaterialButton(
                              onPressed: () async {
                            //validateForm();
                                validateForm();
                              },
                              minWidth: MediaQuery.of(context).size.width,
                              child: Text(
                                "Зарегистрироваться",
                                textAlign: TextAlign.center,
                                style: TextStyle(
                                    color: Colors.white,
                                    fontWeight: FontWeight.bold,
                                    fontSize: 20.0),
                              ),
                            ),
                          ),
                        ),
                        Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: InkWell(
                            onTap: () {
                              Navigator.pop(context);
                            },
                          ),
                        ),
                      ],
                    )),
              ),
            ),
          ),
        ],
      ),
    );
  }

  void validateForm() {
        databaseRef.child(DateTime.now().millisecondsSinceEpoch.toString()).set({
        "name" : _nameTextController.text.toString(),
        "id": DateTime.now().millisecondsSinceEpoch.toString(),
        "email" : _emailTextController.text.toString(),
        "password" : _passwordTextController.text.toString(),

      });
  }
}




Ответы (0 шт):