【问题标题】:Get updated User from Firebase Authentication从 Firebase 身份验证获取更新的用户
【发布时间】:2017-01-05 15:28:10
【问题描述】:

我目前正在使用 Firebase。目前我正在使用com.google.firebase:firebase-auth:10.0.1

创建用户,登录就像一个魅力。

现在我想为用户添加一个选项,用户可以在其中更改他/她的 displayName 和 profileImage

在活动 A 中,我通过单击按钮调用此方法:

   public void updateFirebaseUser(String newDisplayName, Uri newPhotoUri) {
      final FirebaseAuth auth = FirebaseAuth.getInstance();
      final FirebaseUser user = auth.getCurrentUser();
      if (user == null || (TextUtils.isEmpty(newDisplayName) && newPhotoUri == null)) {
         return;
      }
      UserProfileChangeRequest.Builder builder = new UserProfileChangeRequest.Builder();

      if (!TextUtils.isEmpty(newDisplayName)) {
         builder.setDisplayName(newDisplayName);
      }
      if (newPhotoUri != null) {
         builder.setPhotoUri(newPhotoUri);
      }
      UserProfileChangeRequest request = builder.build();
      user.updateProfile(request)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
               @Override
               public void onComplete(@NonNull Task<Void> task) {
                  Toast.makeText(context, "profile update success = " + task.isSuccessful(),
                        Toast.LENGTH_SHORT)
                        .show();
               }
            });
   }

似乎一切正常,因为我在屏幕上收到了 Toast,它显示了"profile update success = true"

稍后在应用程序中我想显示用户信息,我在 Activity B 中调用fillUserViews()但仍然显示我的旧信息。

   private void fillUserViews(NavigationView navigationView) {
      View headerView = navigationView.getHeaderView(0);
      FirebaseAuth auth = FirebaseAuth.getInstance();
      FirebaseUser user = auth.getCurrentUser();

      ImageView avatarVIew = (ImageView) headerView.findViewById(R.id.img_avatar);
      picasso.load(user.getPhotoUrl())
            .into(avatarVIew);

      TextView userName = (TextView) headerView.findViewById(R.id.txt_name);
      userName.setText(user.getDisplayName());

      TextView userMail = (TextView) headerView.findViewById(R.id.txt_mail);
      userMail.setText(user.getEmail());
   }

同样重启应用也无济于事。但是,如果我注销并重新登录,我的用户数据就会更新。

我认为这与 Firebase 内部缓存有关。这就是为什么我在展示了 toast 之后添加了这一行 auth.getCurrentUser().reload();

是否有可能将更新请求强制发送到 Firebase?我在文档中一无所获。

提前致谢!

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

    呜呜呜!我找到了解决方案:

    当我真正需要它时,我正在重新加载用户对象,并且在请求成功后,我正在更新我的视图!

       private void fillUserViews(NavigationView navigationView) {
          final View headerView = navigationView.getHeaderView(0);
          final FirebaseAuth auth = FirebaseAuth.getInstance();
          auth.getCurrentUser()
                .reload()
                .addOnSuccessListener(new OnSuccessListener<Void>() {
    
                   @Override
                   public void onSuccess(Void aVoid) {
                      FirebaseUser user = auth.getCurrentUser();
    
                      ImageView avatarVIew = (ImageView) headerView.findViewById(R.id.img_avatar);
                      picasso.load(user.getPhotoUrl())
                            .into(avatarVIew);
                      TextView userName = (TextView) headerView.findViewById(R.id.txt_name);
                      userName.setText(user.getDisplayName());
                   }
                });
       }
    

    【讨论】:

      【解决方案2】:

      我建议您将firebaseDatabase 中的凭据分别保存为node,并在其中保存用户名和个人资料图片如果设置了适当的侦听器,则在数据库中更改。

      【讨论】:

      • 我也考虑过为此使用 FirebaseDatabase。但基本上我想用 `UserProfileChangeRequest` 试试看
      • 希望您找到了解决方案 :)
      • 如果仍然导致问题尝试直接使用ChildEventListeners
      • 谢谢!目前,我上面发布的简单解决方案对我来说很好......感谢您的支持!
      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多