私のアイデア: 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
を取得しません。
私は何をしなければなりませんか?助けてくれてありがとう:)
アプリで同じ状況に直面しました。私の解決策は、戦略的なルートの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();
}
}
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;
});
});
});
}