FirebaseでFlutterを使用してアプリを作成しています。変な問題があります。認証を作成していますが、正常に機能していますが、いくつかのコレクションをFirestoreデータベースに追加しようとすると、displayNameのレコードがnullに設定されます。
Future<FirebaseUser> createUser(email, password, displayName) async {
final FirebaseUser user = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
UserUpdateInfo info = new UserUpdateInfo();
info.displayName = displayName;
_auth.updateProfile(info);
Firestore.instance.collection('users').document().setData({
'name': user.displayName,
'uid': user.uid,
'email': user.email,
'isEmailVerified': user.isEmailVerified,
'photoUrl': user.photoUrl,
});
return user;
}
これは、ユーザーを作成するFutureクラスです。
void _handleSubmitted() {
userAuth
.createUser(
emailController.text, passwordController.text, nameController.text)
.then((onValue) {
print("Sign Up button clicked: $onValue");
});
}
このメソッドは、サインアップボタンがクリックされたときのハンドルです。
コレクションはこの写真のようになります。
正しく思い出せば、updateProfile
を呼び出してもローカルユーザープロファイルはすぐには更新されません。つまり、ローカル値をデータベースに書き込む(最も簡単)か、プロファイルを強制的にリロードする(最も安全)必要があります。
言ったように、これは最も簡単なアプローチです:
Firestore.instance.collection('users').document().setData({
'name': displayName,
'uid': user.uid,
'email': user.email,
'isEmailVerified': user.isEmailVerified, // will also be false
'photoUrl': user.photoUrl, // will always be null
});
新しく作成された電子メール+パスワードアカウントでは、isEmailVerified
は常にfalseであり、photoUrl
は常にnull
であることに注意してください。
FirebaseUser.reload() を呼び出すことで、ユーザーデータを強制的に再読み込みできます。
await _auth.updateProfile(info);
await user.reload();
user = _auth.getCurrentUser();
Firebase Authの動作は不便で、今のところ変更されないと言われているので、これに対処するためのパッケージを作成しました。ここで入手してください: firebase_user_stream
Readmeで、問題とパッケージがそれらをどのように修正するかを説明します。例などがありますので、お楽しみください!
ユーザーの表示名と写真のURLを更新するには、これが間違いなく役立ちます。
FirebaseUser user = await FirebaseAuth.instance.currentUser();
UserUpdateInfo userUpdateInfo = new UserUpdateInfo();
userUpdateInfo.displayName = name;
userUpdateInfo.photoUrl = url;
user.updateProfile(userUpdateInfo);
私もすべてを試しましたが、これは私にとってはうまくいきます!コードの例のように、FirebaseAuth.instanceを2回呼び出すだけです。
FirebaseUser currentUser = await _auth.currentUser();
await currentUser.reload();
currentUser = await _auth.currentUser();
print("Current User ${currentUser.displayName}");
print("Current User ${currentUser.photoUrl}");
これがあなたに役立つことを願っています!