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