Erreur d'authentification Flutter Firebase .createUserWithEmailAndPassword: getGoogleApiForMethod () a renvoyé Gms: com.google.firebase.auth.api.internal.zzao@fb1556c

Jan 04 2021

Préambule

Cela a été une lutte pendant un bon moment maintenant et rien ne semble fonctionner, j'ai vu des réponses à des questions similaires ici et ici, mais la première n'était pas flottante et la dernière a été publiée avant les récents changements de firebase_authet je suppose que le plus important les solutions proposées n'ont pas fonctionné.

Le problème

Le problème concerne une configuration initiale très très simple de l'authentification Firebase dans Flutter. J'ai configuré mon projet Firebase exactement comme il le suggère ici et utilisé ceci et cela pour le configurer firebase_auth.

Le code à l'origine du problème est le suivant:

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

Lorsque le code est exécuté, l'erreur

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

Est retourné.

Cette réponse semble suggérer que l'erreur peut bien ne pas être pertinente, c'est-à-dire que le code peut quand même fonctionner. J'ai mis un point d'arrêt sur la ligne UserCredential userCredential = await FirebaseAuth.instanceet je suis intervenu, cela continue .createUserWithEmailAndPassword(, puis une fois de nouveau franchi, je reviens à la première ligne et l'erreur s'affiche. Passer au-dessus de toute autre interruption de la fonction entièrement, de sorte que la print(userCredential.user.email);ligne n'est jamais exécutée, ce qui suggérerait que le code ne fonctionne pas. De plus, la print(e);ligne dans le catchn'est pas ce qui génère cette erreur.

Autre info

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,
            ),
          ],
        ),
      ),
    );
  }
}

Cette erreur est également apparue à quelques reprises, bien que cette réponse semble impliquer qu'elle n'a rien à voir avec mon problème et n'est pas indicative d'un problème.

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

ÉDITER

Modification de la ligne onPressed: () => _registerTestUser(),dans main.dartla onPressed: () {_registerTestUser();}donne le même résultat , mais l'erreur change légèrement, le zzao @ fb1556c devient zzao @ ebc85e9.

Réponses

GrahamD Jan 08 2021 at 19:24

Tout en ne répondant pas directement à votre question et en étant apparemment en désaccord (mais pas très différent de) avec l'exemple de code FlutterFire. Voici le code que j'utilise pour créer un utilisateur (Firebase_auth Type User) et je ne vois pas votre erreur:

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

Je peux ensuite utiliser des méthodes telles que await _user.sendEmailVerification();et accéder à ses propriétés, par exemple, _user.emailsans problème.

Essayez peut-être cela au lieu des informations d'identification.

PS. Le problème: W/ConnectionTracker(19240): java.lang.IllegalArgumentException: Service not registered:vous faites référence est suivi ici et je ne pense pas que cela soit lié à votre code:https://github.com/firebase/firebase-android-sdk/issues/1662#issue-638324848

Il a plusieurs variantes de code d'exception mais elles sont toutes liées.

Mise à jour Je crois aussi que @amit kumar est presque correct, vous courezFirebaseAuth auth = FirebaseAuth.instance;avantFirebase.initializeApp();. Vous devez vous assurer que votre avenir se termine avant d'instancier FirebaseAuth, je crois. Rend probablement mon code modifié ci-dessus inutile.

AmitKumar Jan 05 2021 at 00:17

Tout d'abord, comme je peux le voir, vous n'avez pas initialisé correctement firebasedans le main.dartfichier.

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

Vous avez manqué une déclaration, réessayez et si vous rencontrez toujours des problèmes, faites-le moi savoir

JamM.HernandezQuiceno Jan 12 2021 at 01:41

Essayez ceci:

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

Pensez également à utiliser User au lieu 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);
        });
    }