-2
I am trying to create a collection in Firebase and for the document of this collection I would like to take the authentication UID of the user registration, the registration of the authentication is ok but does not create the collection follows the code below:
the Code communicating with Firebase
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:scoped_model/scoped_model.dart';
import 'package:flutter/material.dart';
class UserModel extends Model{
FirebaseAuth _auth = FirebaseAuth.instance;
FirebaseUser firebaseUser;
Map<String, dynamic> userData = Map();
bool isLoading = false;
void signUp({@required Map<String, dynamic> userData, @required String pass, @required VoidCallback onSuccess, @required VoidCallback onFail}){
isLoading = true;
notifyListeners();
_auth.createUserWithEmailAndPassword(
email: userData["email"],
password: pass
).then((user) async{
AuthResult firebaseUser = user;
await _saveUserData(userData);
onSuccess();
isLoading = false;
notifyListeners();
}).catchError((e) async{
onFail();
isLoading = false;
notifyListeners();
print("erro");
});
}
void signIn() async{
isLoading = true;
notifyListeners();
await Future.delayed(Duration(seconds: 3));
isLoading = false;
notifyListeners();
}
void recoverPass(){
}
Future<Null> _saveUserData(Map<String, dynamic> userData) async{
this.userData = userData;
print("teste $userData");
await Firestore.instance.collection("users").document(firebaseUser.uid).setData(userData);
}
}
the View Code of the Registration Form
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:loja_virtual/models/user_model.dart';
import 'package:scoped_model/scoped_model.dart';
class SignUpScreen extends StatefulWidget {
@override
_SignUpScreenState createState() => _SignUpScreenState();
}
class _SignUpScreenState extends State<SignUpScreen> {
final _nameController = TextEditingController();
final _emailController = TextEditingController();
final _passController = TextEditingController();
final _addressController = TextEditingController();
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Criar Conta"),
centerTitle: true,
),
body: ScopedModelDescendant<UserModel>(
builder: (context, child, model) {
if (model.isLoading) {
return Center(child: CircularProgressIndicator());
} else {
return Form(
key: _formKey,
child: ListView(
padding: EdgeInsets.all(16.0),
children: <Widget>[
TextFormField(
controller: _nameController,
decoration: InputDecoration(hintText: "Nome Completo"),
validator: (text) {
if (text.isEmpty) {
return "Nome Inválido!";
}
},
),
SizedBox(height: 16.0),
TextFormField(
controller: _emailController,
decoration: InputDecoration(hintText: "E-mail"),
keyboardType: TextInputType.emailAddress,
validator: (text) {
if (text.isEmpty || !text.contains("@")) {
return "E-mail inválido!";
}
},
),
SizedBox(height: 16.0),
TextFormField(
controller: _passController,
decoration: InputDecoration(hintText: "Senha"),
obscureText: true,
validator: (text) {
if (text.isEmpty || text.length < 6) {
return "Senha Inválida!";
}
},
),
SizedBox(height: 16.0),
TextFormField(
controller: _addressController,
decoration: InputDecoration(hintText: "Endereço"),
validator: (text) {
if (text.isEmpty) {
return "Senha Inválido!";
}
},
),
SizedBox(height: 16.0),
SizedBox(
height: 44.0,
child: RaisedButton(
child: Text(
"Criar Conta",
style: TextStyle(
fontSize: 18.0,
),
),
textColor: Colors.white,
color: Theme.of(context).primaryColor,
onPressed: () {
if (_formKey.currentState.validate()) {
Map<String, dynamic> userData = {
"name": _nameController.text,
"email": _emailController.text,
"address": _addressController.text
};
model.signUp(
userData: userData,
pass: _passController.text,
onSuccess: _onSuccess,
onFail: _onFail
);
}
}),
),
],
),
);
}
},
));
}
void _onSuccess() {}
void _onFail() {}
}
I analyzed that the problem is in the code below:
Firestore.instance.collection("users").document(firebaseUser.uid).setData(userData);
specifically in the firebaseUser.uid variable where printing on the screen returns me the error below:
E/flutter ( 916): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Nosuchmethoderror: The getter 'uid' was called on null. E/flutter ( 916): Receiver: null E/flutter ( 916): Tried Calling: uid E/flutter ( 916): #0 Object.noSuchMethod (Dart:core-patch/object_patch.Dart:53:5)
someone can help me?
Matheus was just that, I did what you said and it worked, thank you very much for your help.
– teste
For nothing little guy, after do not forget to mark my answer as accepted, it helps those who come in search of similar solutions.
– Matheus Ribeiro