6
votes

Comment obtenir l'ID utilisateur actuel de Firebase dans Flutter

J'essaye ceci -

Instance of 'Future<FirebaseUser>'

mais le problème est qu'au lieu de créer un document avec le "userid", il crée un document portant le nom de -

final Future<FirebaseUser> user = auth.currentUser();

Il s'agit littéralement du nom de mes documents pour le moment, mais je veux en faire l'ID utilisateur spécifiquement.

Que dois-je faire?


7 commentaires

Comprenez-vous comment vous êtes censé utiliser Futures dans Dart?


Être totalement honnête avec vous..Non..En fait, je suis nouveau dans ce domaine .. auparavant, je faisais Android java.. donc ouais .. NON


OK, c'est quelque chose que vous allez devoir apprendre si vous voulez écrire des applications avec Flutter. C'est comme ça que vous faites la programmation asynchrone. Si vous ne comprenez pas cela, vous n'irez pas très loin.


Je sais mec ... je travaille dessus ...


Mais dites-moi au moins la solution à ce problème ...


Vous devrez «attendre» le futur pour mettre la main sur l'objet FirebaseUser qu'il contiendra lorsque le travail asynchrone sera terminé. Cet objet FirebaseUser aura une propriété pour l'UID de l'utilisateur. Vous devriez probablement consulter la documentation de l'API Firebase Auth pour Flutter pour plus de détails.


Vous pouvez également lire ici pour en savoir plus sur la programmation asynchrone dans Dart. Sans cette connaissance, vous n'irez pas très loin: dartlang.org/tutorials/language/futures < / a>


6 Réponses :


33
votes

Mise à jour (2020.09.09)

Après la version 0.18.0 de firebase_auth

Peu de mises à jour de rupture ont été effectuées dans firebase_auth 0.18.0. FirebaseUser s'appelle désormais User, currentUser est un getter et currentUser est synchrone.

Cela rend le code pour obtenir un uid comme ceci:

final FirebaseAuth auth = FirebaseAuth.instance;

void inputData() async {
    final FirebaseUser user = await auth.currentUser();
    final uid = user.uid;
    // here you write the codes to input the data into firestore
  }

Avant la version 0.18.0 de firebase_auth

uid est une propriété de l'objet FirebaseUser. Puisque auth.currentUser () retourne un futur, vous devez attendre pour obtenir l'objet utilisateur comme ceci:

final FirebaseAuth auth = FirebaseAuth.instance;

void inputData() {
    final User user = auth.currentUser;
    final uid = user.uid;
    // here you write the codes to input the data into firestore
  }


2 commentaires

Je vous remercie! OMG. nouveau à flutter, et il y a tellement de confusion avec les didacticiels obsolètes.


@martin je vous entends. Les changements de rupture dans les plugins FlutterFire sont relativement récents, donc la mise à jour des documents obsolètes peut prendre un certain temps ...



2
votes

Si vous utilisez la connexion avec Google, vous obtiendrez ces informations sur l'utilisateur.

final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = new GoogleSignIn();
void initState(){
super.initState();
 firebaseAuth.onAuthStateChanged
        .firstWhere((user) => user != null)
        .then((user) {
      String user_Name = user.displayName;
      String image_Url = user.photoUrl;
      String email_Id = user.email;
      String user_Uuid = user.uid; // etc
      }
       // Give the navigation animations, etc, some time to finish
    new Future.delayed(new Duration(seconds: 2))
        .then((_) => signInWithGoogle());
        }

     Future<FirebaseUser> signInWithGoogle() async {
  // Attempt to get the currently authenticated user
  GoogleSignInAccount currentUser = _googleSignIn.currentUser;
  if (currentUser == null) {
    // Attempt to sign in without user interaction
    currentUser = await _googleSignIn.signInSilently();
  }
  if (currentUser == null) {
    // Force the user to interactively sign in
    currentUser = await _googleSignIn.signIn();
  }

  final GoogleSignInAuthentication googleAuth =
      await currentUser.authentication;

  // Authenticate with firebase
  final FirebaseUser user = await firebaseAuth.signInWithGoogle(
    idToken: googleAuth.idToken,
    accessToken: googleAuth.accessToken,
  );

  assert(user != null);
  assert(!user.isAnonymous);

  return user;
}


0 commentaires

4
votes

Vous devez attendre la fin de l'opération asynchrone.

final FirebaseUser user = auth.currentUser().then((FirebaseUser user) {
  final userid = user.uid;
  // rest of the code|  do stuff
});

ou vous pouvez utiliser la syntaxe de style then:

final FirebaseUser user = await auth.currentUser();
final userid = user.uid;


0 commentaires

2
votes

Voici une autre façon de résoudre le problème:

Future<String> inputData() async {
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    final String uid = user.uid.toString();
  return uid;
  }

il renvoie le uid sous forme de chaîne


1 commentaires

A moins que je ne me trompe, ça va toujours retourner un futur, non? Même s'il est de type String? Vous auriez encore besoin de vous en occuper à l'autre bout.



3
votes
RaisedButton(
              onPressed: getCurrentUser,
              child: Text('Details'),
            ),

0 commentaires

0
votes

Le faire normalement retournera toujours

Widget build(BuildContext context) {
    void getid(String foo) {
      userID = foo;
    }

    AuthService().getCurrentUID().then((value) => getid(value));

    return Scaffold(
      ...
    );
}

Essayez d'utiliser .puis comme suit

Commencez par créer une fonction dans votre classe authservice

Future<String> getCurrentUID() async{
    final FirebaseUser user = await _auth.currentUser();
    final String uid = user.uid;
    return uid;
  }


2 commentaires

Cela ne marche pas. Je viens de l'essayer avec mon code et cela donne la même instance de Future .


Avez-vous d'abord créé userID une variable globale? ... Vous ne pouvez le faire qu'en utilisant .then ()