web-dev-qa-db-fra.com

Flutter: Comment écouter FirebaseUser est-il booléen vérifié par e-mail?

My Idea: Je veux utiliser le plugin Firebase Auth dans Flutter pour enregistrer les utilisateurs. Mais avant de pouvoir accéder à l'application, ils doivent vérifier leur adresse e-mail. À cet effet, je pousse les utilisateurs de Firebase après l'enregistrement sur un écran de vérification. Il s'agit simplement d'un écran de chargement qui indique à l'utilisateur qu'il doit vérifier son e-mail.

Mais maintenant: Comment puis-je écouter en continu, si l'e-mail des utilisateurs est vérifié ou non et l'envoyer (quand c'est vrai) à l'écran d'accueil?

Je suis nouveau sur Flutter et je ne sais pas si je dois utiliser un Streams ou Observables ou une boucle while ou setState () ou autre chose pour une telle vérification booléenne. Et je ne sais pas non plus comment configurer une solution.

Voici mon code de base pour enregistrer un utilisateur:

import 'package:cloud_firestore/cloud_firestore.Dart';
import 'Dart:async';

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final Firestore _db = Firestore.instance;

  Future<FirebaseUser> get getUser => _auth.currentUser();

  Stream<FirebaseUser> get user => _auth.onAuthStateChanged;

  Future<FirebaseUser> edubslogin(String email, String password) async {
    try {
      final FirebaseUser user = await _auth.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );

      await user.sendEmailVerification();

      //email verification somewhere here

      updateUserData(user);
      return user;
    } catch (error) {
      print(error);
      return null;
    }
  }

J'ai essayé ça:

     if (user.isEmailVerified == true) {

        //go to Homescreen
        return true; 
      } else {

        //show verification screen(loading spinner)
        return false;
      }

Mais je n'ai pas de valeur booléenne true sur isEmailVerified.

Que dois-je faire? Merci beaucoup pour votre aide :)

5
eifachtimon

Je viens de faire face à la même situation dans mon application. Ma solution a été de créer un minuteur périodique dans la méthode initState d'un itinéraire stratégique pour conserver l'application jusqu'à ce que l'e-mail soit vérifié. Ce n'est pas aussi élégant que d'utiliser un auditeur, mais cela fonctionne bien.

bool _isUserEmailVerified;
Timer _timer;

@override
void initState() {
    super.initState();
    // ... any code here ...
    Future(() async {
        _timer = Timer.periodic(Duration(seconds: 5), (timer) async {
            await FirebaseAuth.instance.currentUser()..reload();
            var user = await FirebaseAuth.instance.currentUser();
            if (user.isEmailVerified) {
                setState((){
                    _isUserEmailVerified = user.isEmailVerified;
                });
                timer.cancel();
            }
        });
    });
}

@override
void dispose() {
    super.dispose();
    if (_timer != null) {
        _timer.cancel();
    }
}
2
Alisson Oliveira

J'ai trouvé un moyen en mettant à jour le profil utilisateur de Firebase et en l'appelant dans init() comme ci-dessous.

void _checkEmailVerification() async {
    await widget.auth.getCurrentUser().then((user) {
      UserUpdateInfo userUpdateInfo = new UserUpdateInfo();
      userUpdateInfo.displayName = user.displayName;
      user.updateProfile(userUpdateInfo).then((onValue) {
        setState(() {
          _isEmailVerified = user.isEmailVerified;
        });
      });
    });
  }
1
Hussnain Haidar