Я хочу создать пользователя, а затем профиль пользователя на основе использования идентификатора во время аутентификации. Но с моим кодом это создает профиль пользователя с другим идентификатором, хотя я уже получаю текущий идентификатор входа пользователя и использую его в установленных данных для профиля пользователя.
Вот мои коды для регистрации. После регистрации я напрямую авторизирую пользователей.
Future <void> signUpValidate(String _email, _password) async {
try {
final snackBar = SnackBar(
content: Text(
'Loading please wait',
),
);
await authReference.createUserWithEmailAndPassword(
email: _email, password: _password);
FirebaseUser user = (await authReference.signInWithEmailAndPassword(
email: _email, password: _password)).user;
Navigator.push(context,MaterialPageRoute(builder: (context)
=> createEditProf()));
}
catch (e) {
print(e.message);
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Ops something gone wrong'),
content: Text('Email already exists'),
);
});
}
}
Затем я создаю форму для пользователя, чтобы создать его профиль. Вот код для этого:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Create/Edit Profile'),
),
body: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
validator: (input){
if (input.isEmpty){
return 'Please insert your name';
}
},
controller: controlName,
onSaved: (input) => _name = input,
decoration: InputDecoration(
labelText: 'Name'
),
),
TextFormField(
validator: (input){
if (input.length > 3){
return 'Age must below than 100';
}
},
controller: controlAge,
keyboardType: TextInputType.number,
onSaved: (input) => _age = int.parse(input),
decoration: InputDecoration(
labelText: 'Age'
),
),
TextFormField(
validator: (input){
if (input.isEmpty){
return 'Insert your address';
}
},
controller: controlAdd,
onSaved: (input) => _address = input,
decoration: InputDecoration(
labelText: 'Address'
),
),
TextFormField(
validator: (input){
if (input.isEmpty){
return 'Insert your result';
}
},
controller: controlRes,
onSaved: (input) => _result = input,
decoration: InputDecoration(
labelText: 'Result'
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: RaisedButton(
onPressed: submitProf,
child: Text('Submit'),
),
)
],
)
],
),
),
);
}
void submitProf(){
if(_formKey.currentState.validate()){
_formKey.currentState.save();
addDataProf(_name, _age, _address, _result);
controlName.clear();
controlAge.clear();
}
}
Future <void> addDataProf(String _name, int _age, String _address,
String _result) async {
try {
final snackBar = SnackBar(
content: Text(
'Loading please wait',
),
);
UniQuery().setUserDetail();
dbReference.collection('User').document(userID).setData(
{'name' : _name, 'age' : _age,
'address' : _address, 'result' : _result});
Navigator.push(context,MaterialPageRoute(builder: (context)
=> mainmenu()));
}
catch (e) {
print(e.message);
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Ops something gone wrong'),
content: Text('Check your detail back'),
);
});
}
}
мой код для getCurrentLoginUserId
var userID;
Future<String> getCurrentUser() async{
final FirebaseUser user = await FirebaseAuth.instance.currentUser();
final String uID = user.uid.toString();
return uID;
}
setUserDetail() async{
userID = await getCurrentUser();
}