usuario signinwith firebaseauth con authui auth autenticacion android firebase firebase-authentication

android - signinwith - firebaseauth



Firebase Android onAuthStateChanged llamado dos veces (3)

Empecé a trabajar con el nuevo SDK de Firebase.

Cuando realizo el inicio de sesión de usuario, estoy en el método de búsqueda de estado de Auth llamado dos veces con el mismo estado (etc. inicio de sesión de usuario).

Estoy seguro de que estoy agregando AuthStateListener solo una vez a la referencia de FirebaseAuth.

¿Alguna ayuda?


Mi solución consiste en utilizar un Boolean declarado globalmente para marcar si onAuthStateChanged tiene necesidad de llamar antes.

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; } } } };


Por lo general, quiero configurar la IU antes de agregar el oyente y repetir la configuración cada vez que cambia el estado de autenticación (evitando la doble llamada inicial). Mi solución es mejorar la solución de indicador booleano y realizar un seguimiento del uid (no del token) del último usuario, que puede ser nulo.

private FirebaseAuth firebaseAuth; private String lastUid; // keeps track of login status and changes thereof

En onCreate , obtengo la instancia de autenticación y configuro la UI en consecuencia, antes de agregar el oyente en onStart

@Override protected void onCreate(Bundle savedInstanceState){ ... firebaseAuth = FirebaseAuth.getInstance(); getUserSetUI(); ... }

donde getUserSetUI establece lastUid de acuerdo con la instancia de autenticación

private void getUserSetUI(){ lastUid = (firebaseAuth == null || firebaseAuth.getCurrentUser() == null) ? null : firebaseAuth.getUid(); setUI(!(lastUid == null)); }

El oyente verifica si el estado realmente ha cambiado

@Override public void onAuthStateChanged(@NonNull FirebaseAuth auth){ String uid = auth.getUid(); // could be null if( (uid == null && lastUid != null) || // loggedout (uid != null && lastUid == null) || // loggedin (uid != null && lastUid != null && // switched accounts (unlikely) !uid.equals(lastUid))){ getUserSetUI(); } }


Sí, y esto es muy molesto. Esto se debe a una llamada de registro. No solo eso, onAuthStateChanged se llamará muchas veces en muchos estados diferentes, sin posibilidad de saber en qué estado se encuentra.

Documentation dice:

onAuthStateChanged (FirebaseAuth auth)

Este método se invoca en el subproceso UI sobre los cambios en el estado de autenticación:

  • Justo después de que el oyente haya sido registrado

  • Cuando un usuario inicia sesión

  • Cuando el usuario actual está desconectado
  • Cuando el usuario actual cambia
  • Cuando hay un cambio en el token del usuario actual

Aquí algunos consejos para descubrir el estado actual:

  • Llamada de registro: omita la primera llamada con una bandera.
  • Usuario registrado: el usuario del parámetro es! = Nulo.
  • Usuario desconectado: el usuario del parámetro es == nulo.
  • Cambios actuales del usuario: el usuario del parámetro es! = Nulo y la última identificación de usuario es! = ID de usuario del parámetro
  • Actualización de token de usuario: el usuario del parámetro es! = Nulo y el último ID de usuario es == ID de usuario del parámetro

Este oyente es un desastre y muy bugprone. El equipo de Firebase debería investigarlo.