Firebase Android onAuthStateChanged调用了两次

Adi*_*Adi 32 android firebase firebase-authentication

我已开始使用新的Firebase SDK.

当我正在进行用户登录时,我的onAuthStateChanged方法被调用两次,状态相同(等用户登录).

我确定我只将一次AuthStateListener添加到FirebaseAuth引用中.

有帮助吗?

Fab*_*cio 35

是的,这非常烦人.这是一次注册电话.不仅如此,onAuthStateChanged将在许多不同的状态中被多次调用,不可能知道它是哪个状态.

文件说:

onAuthStateChanged(FirebaseAuth auth)

在验证状态发生变化的UI线程中调用此方法:

  • 在听众注册之后

  • 用户登录时

  • 当前用户退出时
  • 当前用户更改时
  • 当前用户的令牌发生变化时

这里有一些提示来发现当前状态:

  • 注册电话:跳过带有标志的第一个电话.
  • 用户登录:来自参数的用户是!= null.
  • 用户已注销:参数中的用户== null.
  • 当前用户更改:参数中的用户是!= null,最后一个用户ID是!=来自参数的用户ID
  • 用户令牌刷新:参数中的用户是!= null,最后一个用户ID是参数中的==用户ID

这个听众是一个混乱和非常错误的人.Firebase团队应该调查一下.

  • 即使经过近 6 年......如果这个问题从未得到解决,请不要感到惊讶(https://gist.github.com/chitchcock/1281611) (5认同)
  • 近5年过去了,问题依然存在…… (2认同)

YYY*_*YYY 7

我的解决方法是使用全局声明的布尔值来标记onAuthStateChanged之前是否需要调用.

private Boolean authFlag = false;
 mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
            if (firebaseAuth.getCurrentUser() != null) {
                if(authFlag== false) {
                    // Task to perform once
                    authFlag=true;
                }
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)


Shy*_*gam 5

虽然此处提供的其他答案可能会完成这项工作,但我发现管理标志既麻烦又容易出错。

我更喜欢在短时间内消除事件。假设用户在 200 毫秒内登录然后注销是不太可能的,甚至是不可能的。

TLDR

去抖动意味着在处理事件之前,您等待查看同一事件是否会在预定义的时间段内再次触发。如果是,则重置计时器并再次等待。如果没有,您处理该事件。

这是一个 Android 问题,这不是我的领域,但我确信 android 提供了某种可以帮助完成任务的工具。如果没有,您可以使用一个简单的计时器制作一个。

下面是 Javascript 实现的样子:

var debounceTimeout;
const DebounceDueTime = 200; // 200ms

function onAuthStateChanged(auth)
{
    if (debounceTimeout)
        clearTimeout(debounceTimeout);

    debounceTimeout = timeout(() =>
    {
        debounceTimeout = null;

        handleAuthStateChanged(auth);
    }, DebounceDueTime);
}

function handleAuthStateChanged(auth)
{
    // ... process event
}
Run Code Online (Sandbox Code Playgroud)