Please Help me I want to know how to upload the first name, last name, job, date of birth and a picture of the user in Flutter Null Safety
this is my signup
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:newlivenullsaf/pages/login.dart';
class Signup extends StatefulWidget {
@override
State<Signup> createState() => _SignupState();
}
class _SignupState extends State<Signup> {
final _formkey = GlobalKey<FormState>();
var email = '';
var password = '';
var confirmPassword = '';
@override
void dispose() {
emailController.dispose();
passwordController.dispose();
confirmPasswordController.dispose();
super.dispose();
}
bool isLoading = false;
final nameController = TextEditingController();
final emailController = TextEditingController();
final passwordController = TextEditingController();
final confirmPasswordController = TextEditingController();
registeration() async {
if (password == confirmPassword) {
try {
UserCredential userCredential = await FirebaseAuth.instance
.createUserWithEmailAndPassword(email: email, password: password);
print(UserCredential);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
backgroundColor: Colors.blueGrey,
content: Text(
'Registerd Successfully. Please Sign In ',
style: TextStyle(fontSize: 20.0),
),
),
);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const LoginPage(),
),
);
} on FirebaseAuthException catch (error) {
if (error.code == 'week-password') {
print('Password is too week');
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
backgroundColor: Colors.blueGrey,
content: Text(
'Password is too week ',
style: TextStyle(fontSize: 20.0, color: Colors.amberAccent),
),
),
);
} else if (error.code == 'email-already-in-use') {
print('Account is already exists');
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
backgroundColor: Colors.blueGrey,
content: Text(
'Account is already exists ',
style: TextStyle(fontSize: 20.0, color: Colors.amberAccent),
),
),
);
}
}
} else {
print('Password and Confirm Password does not match ');
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
backgroundColor: Colors.blueGrey,
content: Text(
'Password and Confirm Password does not match ',
style: TextStyle(fontSize: 20.0, color: Colors.amberAccent),
),
),
);
}
}
@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
return Scaffold(
backgroundColor: Colors.white,
body: isLoading
? Center(
child: Container(
height: size.height / 20,
width: size.height / 20,
child: CircularProgressIndicator(),
),
)
: Form(
key: _formkey,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 20.0, horizontal: 20.0),
child: ListView(
children: [
Padding(
padding: const EdgeInsets.all(30.0),
child: Image.asset('images/signup.png'),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField(
autofocus: false,
decoration: const InputDecoration(
labelText: 'Name:',
labelStyle: TextStyle(fontSize: 20.0),
border: OutlineInputBorder(),
errorStyle: TextStyle(
color: Colors.black26, fontSize: 15.0),
),
controller: nameController,
validator: (value) {
if (value == null || value.isNotEmpty) {
return 'Please Enter Your Name';
}
if (value.length > 4) {
return (' Name(Max. 4 Character)');
}
return null;
}),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField(
autofocus: false,
decoration: const InputDecoration(
labelText: 'Last Name:',
labelStyle: TextStyle(fontSize: 20.0),
border: OutlineInputBorder(),
errorStyle: TextStyle(
color: Colors.black26, fontSize: 15.0),
),
controller: nameController,
validator: (value) {
if (value == null || value.isNotEmpty) {
return 'Please Enter Your Last Name';
}
if (value.length > 4) {
return ('Last Name(Max. 4 Character)');
}
return null;
}),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField(
autofocus: false,
decoration: const InputDecoration(
labelText: 'Email:',
labelStyle: TextStyle(fontSize: 20.0),
border: OutlineInputBorder(),
errorStyle:
TextStyle(color: Colors.black26, fontSize: 15.0),
),
controller: emailController,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please Enter Email';
} else if (!value.contains('@')) {
return 'Please Enter Valid Email';
}
return null;
},
),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField(
autofocus: false,
obscureText: true,
decoration: const InputDecoration(
labelText: ' Password',
labelStyle: TextStyle(fontSize: 20.0),
border: OutlineInputBorder(),
errorStyle:
TextStyle(color: Colors.black26, fontSize: 15.0),
),
controller: passwordController,
validator: (value) {
if (value == null ||
value.isEmpty ||
value.length < 6 ||
value.length > 14) {
return 'Please Enter Password';
}
return null;
},
),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField(
autofocus: false,
obscureText: true,
decoration: const InputDecoration(
labelText: 'Confirm Password',
labelStyle: TextStyle(fontSize: 20.0),
border: OutlineInputBorder(),
errorStyle:
TextStyle(color: Colors.black26, fontSize: 15.0),
),
controller: confirmPasswordController,
validator: (value) {
if (value == null ||
value.isEmpty ||
value.length < 6 ||
value.length > 14) {
return 'Please Confirm Password';
}
return null;
},
),
),
const SizedBox(
height: 10.0,
),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
if (_formkey.currentState!.validate()) {
setState(() {
email = emailController.text;
password = passwordController.text;
confirmPassword =
confirmPasswordController.text;
});
registeration();
}
},
child: const Text(
'Signup ',
style: TextStyle(fontSize: 18.0),
),
),
],
),
),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Already Have An Account ?'),
TextButton(
onPressed: () {
Navigator.pushReplacement(
context,
PageRouteBuilder(
pageBuilder:
(context, animation1, animation2) =>
const LoginPage(),
transitionDuration:
const Duration(seconds: 0),
),
);
},
child: const Text('Login'),
),
],
),
),
],
),
),
),
);
}
}
this is my main
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:newlivenullsaf/pages/login.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
if (snapshot.hasError) {
print('something wrong');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
}
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter email & password',
theme: ThemeData(primarySwatch: Colors.blue),
home: const LoginPage(),
);
},
);
}
}
this is my login
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:newlivenullsaf/pages/forget_password.dart';
import 'package:newlivenullsaf/pages/signup.dart';
import 'package:newlivenullsaf/pages/user_main.dart';
class LoginPage extends StatefulWidget {
const LoginPage({Key? key}) : super(key: key);
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final _formKey = GlobalKey<FormState>();
var email = "";
var password = "";
final emailController = TextEditingController();
final passwordController = TextEditingController();
userLogin() async {
try {
await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
Navigator.pushReplacement(
context, MaterialPageRoute(builder: (context) => const UserMain()));
} on FirebaseAuthException catch (error) {
if (error.code == ' user-not-found') {
print('No user found for that email ');
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
backgroundColor: Colors.blueGrey,
content: Text(
'No user found for that email',
style: TextStyle(
fontSize: 18.0,
color: Colors.amber,
),
),
),
);
} else if (error.code == 'wrong-password') {
print('wrong password provided by the user');
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
backgroundColor: Colors.blueGrey,
content: Text(
'wrong password provided by the user',
style: TextStyle(
fontSize: 18.0,
color: Colors.amber,
),
),
),
);
}
}
}
@override
void dispose() {
emailController.dispose();
passwordController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Form(
key: _formKey,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 40.0, horizontal: 20.0),
child: ListView(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('images/login.jpg'),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField(
autofocus: false,
decoration: const InputDecoration(
labelText: 'Email:',
labelStyle: TextStyle(fontSize: 20.0),
border: OutlineInputBorder(),
errorStyle:
TextStyle(color: Colors.black26, fontSize: 15.0),
),
controller: emailController,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please Enter Email';
} else if (!value.contains('@')) {
return 'Please Enter Valid Email';
}
return null;
}),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField(
autofocus: false,
obscureText: true,
decoration: const InputDecoration(
labelText: 'Password',
labelStyle: TextStyle(fontSize: 20.0),
border: OutlineInputBorder(),
errorStyle:
TextStyle(color: Colors.black26, fontSize: 15.0),
),
controller: passwordController,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please Enter Password';
}
return null;
},
),
),
Container(
margin: const EdgeInsets.symmetric(vertical: 20.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
setState(() {
email = emailController.text;
password = passwordController.text;
});
userLogin();
}
},
child: const Text(
'Login',
style: TextStyle(fontSize: 18.0),
),
),
TextButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ForgotPass(),
),
);
},
child: const Text(
'Forget Password ?',
style: TextStyle(
fontSize: 12.0,
),
),
)
],
),
),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Do Not Have Account ?'),
TextButton(
onPressed: () {
Navigator.pushAndRemoveUntil(
context,
PageRouteBuilder(
pageBuilder: (context, a, b) => Signup(),
transitionDuration: const Duration(seconds: 0),
),
(route) => false);
},
child: const Text('Signup'),
),
],
),
),
],
),
),
),
);
}
}
Iused these packages
firebase_core: ^1.5.0
firebase_auth: ^3.0.2
I searched a lot and found a lot of codes and This code is the best I've found
please i need help quickly
CodePudding user response:
I think you have to add (keep the auth like it is) cloud firestore and set a doc for each user contains his name , last name , job , profile pic etc...
so every user will have doc on cloud firestore and user on Auth
some sources :
to set the user in singUp page :
https://petercoding.com/firebase/2020/04/04/using-cloud-firestore-in-flutter/
CodePudding user response:
First of all, I thank you for your interest and help me ,But I am a new flutter student and I tried all the codes that you answered It didn't work for me , I need help to making a collection in my code , i use that code
// ignore: deprecated_member_use
userCredential.user!.updateProfile(displayName: name);
await _firestore.collection('users').doc(userCredential.user?.uid).set({
"name": name,
"email": email,
"status": "Unavalible",
"uid": userCredential.user?.uid,
});
but its deprecated after createUserWithEmailAndPassword
so how can i Make a collection
try {
UserCredential userCredential = await FirebaseAuth.instance
.createUserWithEmailAndPassword(email: email, password: password);
///////////////
////// **i need her to do my collection**
//////////////
print(UserCredential);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
backgroundColor: Colors.blueGrey,
content: Text(
'Registerd Successfully. Please Sign In ',
style: TextStyle(fontSize: 20.0),
),
),
);
I hope to be clear in the request because I have tried many codes and methods and this is what I found most suitable for me