web-dev-qa-db-ja.com

Flutter:FirebaseUserのメールを確認するブール値を聞く方法は?

私のアイデア: FlutterでFirebase Authプラグインを使用してユーザーを登録したい。ただし、アプリにアクセスする前に、メールアドレスを確認する必要があります。そのため、登録後にFirebaseユーザーを確認画面にプッシュします。これは、ユーザーにメールを確認する必要があることを伝えるロード画面です。

しかし今:ユーザーのメールアドレスが確認されているかどうかを確認し、ホーム画面に送信する(trueの場合)にはどうすればよいですか?

Flutterは初めてですが、そのようなブール値のチェックにStreamsやObservables、while Loop、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;
      }

しかし、trueからブール値isEmailVerifiedを取得しません。

私は何をしなければなりませんか?助けてくれてありがとう:)

5
eifachtimon

アプリで同じ状況に直面しました。私の解決策は、戦略的なルートのinitStateメソッドに定期的なタイマーを作成して、電子メールが確認されるまでアプリを保持することでした。リスナーを使用するほどエレガントではありませんが、正常に動作します。

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

Firebaseユーザープロファイルを更新し、init()で以下の関数のように呼び出す方法を見つけました。

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