web-dev-qa-db-ja.com

Flutter-firebase_auth updateProfileメソッドが機能しない

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");

    });
  }

このメソッドは、サインアップボタンがクリックされたときのハンドルです。

コレクションはこの写真のようになります。

collection

6
user6082142

正しく思い出せば、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();
8

Firebase Authの動作は不便で、今のところ変更されないと言われているので、これに対処するためのパッケージを作成しました。ここで入手してください: firebase_user_stream

Readmeで、問題とパッケージがそれらをどのように修正するかを説明します。例などがありますので、お楽しみください!

2
mFeinstein

ユーザーの表示名と写真のURLを更新するには、これが間違いなく役立ちます。

  FirebaseUser user = await FirebaseAuth.instance.currentUser();

  UserUpdateInfo userUpdateInfo = new UserUpdateInfo();
  userUpdateInfo.displayName = name;
  userUpdateInfo.photoUrl = url;

  user.updateProfile(userUpdateInfo);
1
Sushant Patil

私もすべてを試しましたが、これは私にとってはうまくいきます!コードの例のように、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}");

これがあなたに役立つことを願っています!