es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Navigator.pushReplacement da como resultado la operación del operador de comprobación de nulos utilizado en un valor nulo. Esta vez es – state.

La clase proveedora de inicio de sesión de Google no está navegando a la siguiente pantalla. Iniciar sesión funciona, pero el usuario tiene que cerrar la aplicación y luego abrirla de nuevo. Después de volver a abrir la aplicación, funciona correctamente con el usuario iniciado sesión.

El registro de errores muestra:
[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Null check operator used on a null value
E/flutter ( 9884): #0 StatefulElement.state (package:flutter/src/widgets/framework.dart:4789:44)
E/flutter ( 9884): #1 Navigator.of (package:flutter/src/widgets/navigator.dart:2730:47)
E/flutter ( 9884): #2 GoogleSignInProvider.signInwithGoogle (package:blahblah/google_signin_provider.dart:37:17)
E/flutter ( 9884): <asynchronous suspension>

El error apunta a un “estado” en la clase Navigator. ¿Cómo lo configuro para que la aplicación navegue?

class GoogleSignInProvider extends ChangeNotifier {

final FirebaseAuth _auth = FirebaseAuth.instance;
User user = firebaseAuth.currentUser;
final GoogleSignIn _googleSignIn = GoogleSignIn();

 Future<string> signInwithGoogle(BuildContext context) async {

  try {
    final GoogleSignInAccount googleSignInAccount =
    await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleSignInAuthentication =
    await googleSignInAccount.authentication;
    final AuthCredential credential = GoogleAuthProvider.credential(
      accessToken: googleSignInAuthentication.accessToken,
      idToken: googleSignInAuthentication.idToken,
    );
    await _auth.signInWithCredential(credential);
  } on FirebaseAuthException catch (e) {
    print(e.message);
    throw e;
  }

  final User currentUser = FirebaseAuth.instance.currentUser;
  String uid = currentUser.uid;
  if (currentUser != null)
    await usersRef.doc(currentUser.uid).set({'id': uid, 'email': 
 currentUser.email,
      'username': currentUser.displayName, 'photoUrl': 
 currentUser.photoURL,
      'phone': '', 'dob': '', 'sex': ''});

 Navigator.of(context).pushReplacement(
      MaterialPageRoute(builder: (_) => TabScreen()));
  notifyListeners();
  return null;
}

Future logout() async {
await _googleSignIn.disconnect();
FirebaseAuth.instance.signOut();
}
}

¡Gracias por la ayuda!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que se está utilizando un valor nulo en un estado de la clase Navigator. Es probable que el problema radique en el contexto que se está pasando en el método signInWithGoogle.

    Para solucionar el problema, asegúrese de pasar el contexto de MaterialApp o WidgetsApp para inicializar el Navigator en MaterialApp o WidgetsApp. Por ejemplo:

    return MaterialApp(
      navigatorKey: navigatorKey,
      ...
    );
    

    Luego, utilice navigatorKey para navegar de esta manera:

    navigatorKey.currentState.pushReplacement(
      MaterialPageRoute(builder: (_) => TabScreen())
    );
    

    Esto debería solucionar el problema de que la clase Google SignIn Provider no navegue a la siguiente pantalla.

Comments are closed.