当前位置: 首页 > 知识库问答 >
问题:

颤振:如何倾听FirebaseUser的电子邮件验证布尔值?

郎磊
2023-03-14

我的想法:我想在Flutter中使用Firebase Auth插件来注册用户。但是在他们访问应用程序之前,他们必须验证他们的电子邮件地址。因此,我将Firebase用户注册后推到一个验证屏幕。这只是一个加载屏幕,告诉用户他必须验证他的电子邮件。

但现在:如果用户的电子邮件经过验证与否,我如何持续收听并将其发送到主屏幕(如果是真的)?

我对颤振还不熟悉,我不知道是否必须使用流或可观测值或while循环或setState()或其他方法来进行此类布尔检查。我也不知道如何设置解决方案。

这是我注册用户的基本代码:

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;
    }
  }

我试过这个:

     if (user.isEmailVerified == true) {
        
        //go to Homescreen
        return true; 
      } else {

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

但是我没有从< code>isEmailVerified中获得布尔值< code>true。

我必须做什么?

共有3个答案

陈寒
2023-03-14

我创建了一个流来处理这个。不太优雅,但很有效。使用StreamProvider.value()来处理事件。

  Stream<userVerificationStatus> checkUserVerified() async* {
    bool verified = false;
    yield userVerificationStatus(status: Status.LOADING); 
    while (!verified) {
      await Future.delayed(Duration(seconds: 5));
      FirebaseUser user = await _auth.currentUser();
      if(user!=null)await user.reload();
      if (user == null) {
        yield userVerificationStatus(status: Status.NULL);
      } else {
        print("isemailverified ${user.isEmailVerified}");
        await user.reload();
        verified = user.isEmailVerified;
        if(verified)
        yield userVerificationStatus(status: Status.VERIFIED);
        else
        yield userVerificationStatus(status: Status.NOT_VERIFIED);
      }
    }
  }
南宫凡
2023-03-14

这种验证并不像您希望的那么简单。首先,存在识别用户已验证其电子邮件的问题。其次,存在一个问题,即没有任何类型的通知可以收听,这些通知会自动触发应用程序中的更改。

检查此线程有关电子邮件的信息已验证:https://github.com/flutter/flutter/issues/20390#issuecomment-514411392

我只能验证用户,如果我1)创建他们的帐户,2)登录他们,3)然后检查以确保他们验证了他们的电子邮件。

final FirebaseAuth _auth = FirebaseAuth.instance;

var _authenticatedUser = await _auth.signInWithEmailAndPassword(email: _email, password: _password); 

//where _email and _password were simply what the user typed in the textfields.



if (_authenticatedUser.isEmailVerified) {
        //Verified
      } else {
        //Not verified
        }

第2部分:如何让您的应用程序识别用户已确认他们的电子邮件?找到一种方法来触发检查确认的功能。一个按钮很容易。如果你想让它看到“自动”,那么我想你可以创建一个计时器,每10秒左右检查一次电子邮件验证。

景星光
2023-03-14

我在我的应用程序中也遇到了同样的情况。我的解决方案是在策略路由的initState方法中创建一个周期计时器,以在验证电子邮件之前保持应用程序。它没有使用监听器那么优雅,但效果很好。

import 'dart:async';
import 'package:firebase_auth/firebase_auth.dart';

class _AccountConfirmationState extends State<AccountConfirmation> {

    late Timer _timer;

    @override
    void initState() {
      super.initState();
      
      _timer = Timer.periodic(const Duration(seconds: 5), (timer) async {
      await FirebaseAuth.instance.currentUser?.reload();
      final user = FirebaseAuth.instance.currentUser;
        if (user?.emailVerified ?? false) {
          timer.cancel();
          Navigator.pop(context, true);
        }
      });
    }

    @override
    void dispose() {
      super.dispose();
      _timer.cancel();
    }

    @override
    Widget build(BuildContext context) {
      //TODO: Implement your amazing waiting screen here
    }

}
 类似资料:
  • 如果您的电子邮件未经验证,我的登录页面将重定向到另一个页面。这第二页是为了迫使用户验证电子邮件。页面加载后,验证邮件将与以下内容一起发送: 现在用户转到电子邮件并单击验证链接。 我如何在我的代码中设置一个侦听器,在验证电子邮件后启动一个函数??

  • 每当我在Firebase中使用电子邮件/密码身份验证提供程序时,提供程序都会在成功注册时发送一个无记名令牌,即使是。是否有一种开箱即用的方法将电子邮件/密码身份验证提供程序配置为在用户验证其电子邮件地址之前不发送无记名令牌(并返回403错误)? 请注意,我知道如何创建用户、登录用户、发送验证电子邮件等。。。使用firebase v9。x通过firebase/auth中的方法创建用户(使用Email

  • 我正在提示我的应用程序用户提供电子邮件凭据。 在用户插入电子邮件并通过后,我想验证该帐户。 我正在使用javax。邮政有没有办法验证帐户?只确保凭据确实有效——否则我想显示一个无效用户并传递消息。 也许是某种表演方式: 并在不发送任何内容的情况下检查身份验证异常。

  • 问题内容: 我如何使用php5验证输入值是有效的电子邮件地址。现在我正在使用此代码 但显示已弃用的错误。我该如何解决此问题。请帮我。 问题答案: 您可以使用该功能,该功能为您提供了许多方便的验证和消毒选项。 PHP手册filter_var() 在 PHP > = 5.2.0中*可用 * 如果您不想更改依赖于函数的代码,请执行以下操作: 注意 :对于其他用途(需要Regex的地方),不赞成使用的函数

  • 我遵循本指南,我有以下代码: 发送电子邮件可以正常工作,但是当我单击电子邮件时,然后... 在iOS它打开https://example.com/auth/widget-这是后备 在Android中,它显示一个循环加载器大约1秒,然后它“倒下”,什么也没发生 传入链接处理程序 我在 Firebase 中将动态链接配置为指向 。我还添加了一个手动动态链接 打开我的应用程序(消息) - 所以一切似乎都

  • 如何使用firebase中的验证电子邮件验证使用电子邮件和密码登录的用户?这背后的逻辑是如何工作的,它在代码中会是什么样子? 解决方案/帮助:对于那些仍在寻找答案的人,我找到了这篇文章 堆栈溢出 帖子