我刚开始接触Flutter,我在Youtube上得到了一个教程,当应用程序应该发送给我用户uid时,我遇到了一个错误,因为代码在新版本的Firebase上已经过时了,即使在互联网上搜索时,我也找不到为什么firestore总是给我发送一个空的uid。感谢那些会回答我的人,我已经被屏蔽了2天了:)
翻译很抱歉,我不太会说英语,所以我用了google =)
错误来自代码“Firebase.instance.currentUser.then((”
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_tuto/constants/chargement.dart';
import 'package:flutter_tuto/pageCrud/accueil.dart';
class Inscription extends StatefulWidget {
final Function basculement;
Inscription({ this.basculement });
@override
_InscriptionState createState() => _InscriptionState();
}
class _InscriptionState extends State<Inscription> {
FirebaseAuth _auth = FirebaseAuth.instance;
User courantUser;
//Collection Utilisateur depuis firestore
final CollectionReference collectionUtil = FirebaseFirestore.instance.collection('utilisateurs');
String email = '';
String pseudo = '';
String motDePasse = '';
String confirmeMdp = '';
bool chargement = false;
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
FirebaseAuth.instance.currentUser().then((User util){
setState(() {
this.courantUser = util;
});
});
String _idUtil(){
if(courantUser != null){
return courantUser.uid;
}else{
return "pas d'utilisateurs courant";
}
}
return chargement ? Chargement() : Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/BackgroundImage.jpg"),
fit: BoxFit.cover
)
),
child: Scaffold(
backgroundColor: Colors.transparent,
body: SingleChildScrollView(
child: Container(
padding: EdgeInsets.symmetric(vertical: 100.0, horizontal: 30.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Image.asset("assets/logo.png", height: 100.0, width: 100.0),
SizedBox(height: 10.0),
Center(
child: Text("Créer un compte Stix pour accéder à notre appli", style: TextStyle(fontSize: 20.0, color: Colors.blueAccent[100]))
),
SizedBox(height: 10.0),
TextFormField(
decoration: InputDecoration(
labelText: "Adresse Mail",
border: OutlineInputBorder()
),
validator: (val) => val.isEmpty ? 'Entrez une adresse mail' : null,
onChanged: (val) => email = val,
),
SizedBox(height: 10.0),
TextFormField(
decoration: InputDecoration(
labelText: "Pseudo",
border: OutlineInputBorder()
),
validator: (val) => val.isEmpty ? 'Entrez votre pseudo' : null,
onChanged: (val) => pseudo = val,
),
SizedBox(height: 10.0),
TextFormField(
decoration: InputDecoration(
labelText: "Mot de passe",
border: OutlineInputBorder()
),
validator: (val) => val.length < 6 ? 'Votre mot de passe doit contenir au moins 6 caractères' : null,
onChanged: (val) => motDePasse = val,
obscureText: true,
),
SizedBox(height: 10.0),
TextFormField(
decoration: InputDecoration(
labelText: "Confirmez le mot de passe",
border: OutlineInputBorder()
),
validator: (val) => val != motDePasse ? 'Le mot de passe doit correspondre a la confirmation' : null,
onChanged: (val) => confirmeMdp = val,
obscureText: true,
),
FlatButton(
onPressed: () async {
if (_formKey.currentState.validate()){
setState(() {
chargement = true;
});
UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: motDePasse);
await collectionUtil.doc(_idUtil()).set({
'idUtil' : _idUtil(),
'pseudo' : pseudo,
'email' : email
});
if(result == null){
setState(() => chargement = true);
}
}
},
color: Colors.blueAccent,
child: Text("S'inscrire"),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0)
),
),
OutlineButton(
onPressed: (){
widget.basculement();
},
borderSide: BorderSide(width: 2.0, color: Colors.blueAccent),
child: Text("Déja Inscrit ?"),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0)
),
),
],
)
)
),
),
)
);
}
}发布于 2021-01-21 17:49:20
只需使用
FirebaseAuth.instance.currentUser在最近的更改中,它被更新为getter。Firebase正在将用户保存在自身之下。
您的代码将如下所示
String _idUtil(){
var user = FirebaseAuth.instance.currentUser;
if(user != null){
return user.uid;
}else{
return "pas d'utilisateurs courant";
}
}如果您正在检查用户是否已登录,我会考虑使用authStateChanges
示例
@override
void initState() {
_firebaseAuth.authStateChanges().listen(_onAuthStateChanged);
super.initState();
}
Future<void> _onAuthStateChanged(User firebaseUser) async {
if (firebaseUser != null) {
setState((){
_status = AuthStatus.LOGGED_IN;
}
} else {
setState((){
_status = AuthStatus.NOT_LOGGED_IN;
}
}
}发布于 2021-01-21 17:58:49
Future<String> getCurrentUID() async{
final FirebaseUser user = await _auth.currentUser();
final String uid = user.uid;
return uid;
}使用这段代码来获取uid作为返回。因为这里使用的是Future,所以async关键字是必须的。
https://stackoverflow.com/questions/65824672
复制相似问题