Todo en cuanto a la autenticación está funcionando bien. Incluso tengo una configuración de estado de carga para que el cargador se muestre hasta que se cambie el estado, pero sigo teniendo este parpadeo al recargar. Este parpadeo solo ocurre con Supabase. Estaba usando la versión de Firebase antes y funcionó perfectamente con mi código.
Aquí hay un video de referencia: https://imgur.com/a/5hywXj5
Editar: código actualizado a la versión actual
export default function Navigation() { const { user, setUser } = useContext(AuthenticatedUserContext); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const session = supabase.auth.session(); setUser(session?.user ?? null); const { data: listener } = supabase.auth.onAuthStateChange((_: any, session: any) => { setUser(session?.user ?? null); }); setIsLoading(false); return () => { listener?.unsubscribe(); }; }, []); if (isLoading) { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <ActivityIndicator color={Theme.colors.purple} size="large" /> </View> ); } return ( <NavigationContainer linking={LinkingConfiguration}>{user ? <AppStack /> : <AuthStack />}</NavigationContainer> ); }Para recapitular para otros, onAuthStateChange no se ejecutará en la carga de la primera página, por lo que lo está activando mediante la función asíncrona getUserAuthStatus . Sin embargo, la función session() no es asíncrona e inmediatamente devolverá un resultado null si no hay una sesión de usuario, o devolverá una sesión que se haya almacenado en localStorage .
En este caso, el resultado de getUserAuthStatus siempre devolverá un valor nulo. Luego, onAuthStateChange se activará con el evento SIGNED_IN y una sesión que luego configurará al usuario.
Además, la función onAuthStateChange debe registrarse antes de realizar el paso de la sesión para capturar cualquier evento desencadenado. En la forma actual, un evento puede desencadenarse directamente después de la llamada session() pero antes de que se registre el controlador.
Entonces, para recapitular, los pasos de renderizado serán:
isLoading: true user: null isLoading: false user: null isLoading false user: {...}Por lo que puedo decir, usar la sesión directamente sin pensar que es asíncrono hará el truco.