Flutter Firebase Auth Error .createUserWithEmailAndPassword: getGoogleApiForMethod () devolvió Gms: com.google.firebase.auth.api.internal.zzao@fb1556c

Jan 04 2021

Preámbulo

Esta ha sido una lucha por un buen tiempo, y nada parece estar funcionando, he visto respuestas a preguntas similares aquí y aquí , pero el primero no estaba en el aleteo y el último fue publicado antes de que los recientes cambios a firebase_authy supongo que lo más importante es la las soluciones propuestas no han funcionado.

La cuestión

El problema se refiere a una configuración inicial muy simple de autenticación de base de fuego dentro de flutter. He configurado mi proyecto de base de fuego exactamente como se sugiere aquí y utilicé esto y esto para configurarlo firebase_auth.

El código que está causando el problema es el siguiente:

void _registerTestUser() async {
  try {
    UserCredential userCredential = await FirebaseAuth.instance
        .createUserWithEmailAndPassword(
            email: "[email protected]",
            password: "SuperSecretPassword!");
    print(userCredential.user.email);
  } on FirebaseAuthException catch (e) {
    if (e.code == 'weak-password') {
      print('The password provided is too weak.');
    } else if (e.code == 'email-already-in-use') {
      print('The account already exists for that email.');
    }
  } catch (e) {
    print(e);
  }
}

Cuando se ejecuta el código, el error

I / BiChannelGoogleApi (19546): [FirebaseAuth:] getGoogleApiForMethod () devolvió Gms: com.google.firebase.auth.api.internal.zzao@fb1556c

Es regresado.

Esta respuesta parece sugerir que el error puede ser irrelevante, es decir, el código puede funcionar de todos modos. Puse un punto de interrupción en la línea UserCredential userCredential = await FirebaseAuth.instancey me acerqué, continúa .createUserWithEmailAndPassword(, luego, una vez que lo paso, vuelve a la primera línea y se muestra el error. Pasar por encima de cualquier otra ruptura de la función por completo, por lo que la print(userCredential.user.email);línea nunca se ejecuta, lo que sugeriría que el código no está funcionando. Además, la print(e);línea en el catchno es lo que genera este error.

Otra información

Pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^0.5.3 #firebase core flutter sdk
  firebase_auth: ^0.18.4+1 #firebase authorisation

android / build.gradle

dependencies {
    classpath 'com.android.tools.build:gradle:3.5.0'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath 'com.google.gms:google-services:4.3.4'  // Google Services plugin
}

android / app / build.gradle

apply plugin: 'com.google.gms.google-services'  // Google Services plugin

main.dart

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_auth/firebase_auth.dart';

FirebaseAuth auth = FirebaseAuth.instance;

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FutureBuilder(
        // Initialize FlutterFire:
        future: _initialization,
        builder: (context, snapshot) {
          // Check for errors
          if (snapshot.hasError) {
            return Error();
          }

          // Once complete, show your application
          if (snapshot.connectionState == ConnectionState.done) {
            return MyHomePage();
          }

          // Otherwise, show something whilst waiting for initialization to complete
          return Loading();
        },
      ),
    );
  }
}

class Loading extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('Firebase is loading'),
      ),
    );
  }
}

class Error extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('There has been an error'),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  void _registerTestUser() async {
    try {
      UserCredential userCredential = await FirebaseAuth.instance
          .createUserWithEmailAndPassword(
              email: "[email protected]",
              password: "SuperSecretPassword!");
      print(userCredential.user.email);
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        print('The password provided is too weak.');
      } else if (e.code == 'email-already-in-use') {
        print('The account already exists for that email.');
      }
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('FlutterFire Test')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            RaisedButton(
              child: Text('Register a test user'),
              onPressed: () => _registerTestUser(),
              color: Colors.blue,
            ),
          ],
        ),
      ),
    );
  }
}

Además, este error ha aparecido varias veces, aunque esta respuesta parece implicar que no tiene nada que ver con mi problema y no es indicativo de un problema.

W / ConnectionTracker (19240): java.lang.IllegalArgumentException: Servicio no registrado: lp @ fb1556c W / ConnectionTracker (19240): en android.app.LoadedApk.forgetServiceDispatcher (LoadedApk.java:1729) W / ConnectionTracker (19240): en android.app.ContextImpl.unbindService (ContextImpl.java:1874) W / ConnectionTracker (19240): en android.content.ContextWrapper.unbindService (ContextWrapper.java:792) W / ConnectionTracker (19240): en ci.f (: com .google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 1) W / ConnectionTracker (19240): en ci.d (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 2) Con ConnectionTracker (19240): en lq.D (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 10) Con ConnectionTracker (19240) : en lc.a (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 2) W / ConnectionTracker (19240): en ee.run (: com.google.android.gms .dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 3) W / ConnectionTracker (19240): en java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:462) W / ConnectionTracker (19240): en java.util.concurrent.FutureTask.run (FutureTask.java: 266) W / ConnectionTracker (19240): en ix.run (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 6)

EDITAR

Cambiar la línea onPressed: () => _registerTestUser(),en main.dartque onPressed: () {_registerTestUser();}da el mismo resultado, pero cambia ligeramente el error, el zzao @ fb1556c convierte zzao @ ebc85e9.

Respuestas

GrahamD Jan 08 2021 at 19:24

Si bien no responde directamente a su pregunta y aparentemente está en desacuerdo (aunque no es muy diferente) con el código de muestra de FlutterFire. Aquí está el código que utilizo para crear un usuario (Firebase_auth Type User) y no veo su error:

User _user = (await _firebaseAuth.createUserWithEmailAndPassword(
              email: email,
              password: password,
            )).user;

Luego puedo usar métodos como await _user.sendEmailVerification();y acceder a sus propiedades _user.emailsin problemas.

Quizás intente eso en lugar de la credencial.

PD. El problema: al W/ConnectionTracker(19240): java.lang.IllegalArgumentException: Service not registered:que se refiere se está rastreando aquí y no creo que esté relacionado con su código:https://github.com/firebase/firebase-android-sdk/issues/1662#issue-638324848

Tiene varias variaciones de código de excepción, pero todas están relacionadas.

Actualización También creo que @amit kumar es casi correcto, estás ejecutandoFirebaseAuth auth = FirebaseAuth.instance;antesFirebase.initializeApp();. Debe asegurarse de que su futuro se complete antes de crear una instancia de FirebaseAuth, creo. Probablemente hace que mi código modificado anterior sea irrelevante.

AmitKumar Jan 05 2021 at 00:17

En primer lugar, puedo ver que no se ha inicializado correctamente firebaseen el main.dartarchivo.

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

Te perdiste una declaración, inténtalo de nuevo y si aún tienes problemas, avísame

JamM.HernandezQuiceno Jan 12 2021 at 01:41

Prueba esto:

  void _registerTestUser() async {
    try {
      await FirebaseAuth.instance
          .createUserWithEmailAndPassword(
              email: "[email protected]",
              password: "SuperSecretPassword!")
          .then((userCredential) => print(userCredential.user.email));
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        print('The password provided is too weak.');
      } else if (e.code == 'email-already-in-use') {
        print('The account already exists for that email.');
      }
    } catch (e) {
      print(e);
    }
  }

También considere usar User en lugar de UserCredential:

  void _registerTestUser() async {
    try {
      final User user = (await FirebaseAuth.instance
              .createUserWithEmailAndPassword(
                  email: "[email protected]",
                  password: "SuperSecretPassword!"))
          .user;

      print(user.email);
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        print('The password provided is too weak.');
      } else if (e.code == 'email-already-in-use') {
        print('The account already exists for that email.');
      }
    } catch (e) {
      print(e);
    }
  }
ChizaramSuccess Jan 12 2021 at 22:34
 final FirebaseAuth _auth = FirebaseAuth.instance;

        registerUser()async{
        _auth.createUserWithEmailAndPassword(
         email:"[email protected]",
         password: "SuperSecretPassword!",
        ).then((result){
User user = result.user;
}).catchError((e) {
          print(e);
        });
    }