【问题标题】:Firebase addListenerForSingleValueEvent datasnapshot returning nullFirebase addListenerForSingleValueEvent 数据快照返回 null
【发布时间】:2020-08-05 18:20:53
【问题描述】:

我尝试使用 Firebase 实时数据库进行登录活动。

注册时我的数据库如下图所示:

登录时,我想初始化一个公共静态用户,以便我可以在我的主要活动中检索它并相应地更新 UI,但 ValueEventListener 的 dataSnapshop 返回 null。

这是我的 addListenerForSingleValueEvent 的代码:

currentUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        currentUserUsername = dataSnapshot.child("/username").getValue(String.class);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        currentUserUsername = "ERROR";
    }

});

// Get every information into a User class
MainActivity.CURRENT_USER_SESSION = new User(
        currentUserUsername,
        user.getEmail(),
        user.getUid()
);

任何人有想法可以帮助我。或者有什么解决方法或建议可以做得更好?

编辑:下面是 currenUserReference 的初始化

currentUserReference = database.getReference("users/" + user.getUid());

数据库在 onCreate 中是这样初始化的:

database = FirebaseDatabase.getInstance();

我从中获取 Uid 的“用户”是 firebaseAuth.getCurrentUser 在检查 signInWithEmailAndPassword.addOnCompleteListener 是否成功后返回的 FirebaseUser。

在 addListenerForSingleValueEvent 之后,我添加了一个 Log.d,其编写如下:

Log.d(TAG, "Value of variable: " + currentUserUsername);

我希望 currentUserUsername 在分配的数据库中具有“用户名”的值,但相反,我得到:

LoginActivity:变量值:null

Edit2:在调试时,我意识到当调试器到达 .addListenerForSingleValueEvent 并按 F8 时,它完全跳过了这个方法。因此,正如评论中有人所说,数据快照可能不为空,它从未被访问过。但我还是不明白为什么。

【问题讨论】:

  • 请编辑您的问题以包含您如何初始化currentUserReference的代码。
  • 另请注意:传递给onDataChange 的dataSnapshot 将永远为空。究竟是什么行不通。通常最容易看出您是否包含 som` Log.d()` 语句,这些语句不会产生您期望的输出。
  • 这样试试 `currentUserUsername = (String) dataSnapshot.child("username").getValue();`
  • @Black4Guy 不幸的是,它不起作用。我编辑了更多可能有帮助的信息。既然 Frank 告诉我 datasnapshot 不可能返回 null 并且我确认这实际上不是我的调试问题,我是否应该编辑标题?

标签: java android firebase-realtime-database firebase-authentication


【解决方案1】:

当您退出 onDataChange 时,dataSnapshot.getValue(String.class) 不返回 null 您的 currentUserUsername 已重新初始化。

因此,要将值传递给下一个活动,您需要:

currentUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            currentUserUsername = dataSnapshot.getValue(String.class);
            // Get every information into a User class
            MainActivity.CURRENT_USER_SESSION = new User(
                    currentUserUsername,
                    user.getEmail(),
                    user.getUid()
            );
            Intent intent = new Intent(
                    LoginActivity.this, MainActivity.class);
            startActivity(intent);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多