Errore di autenticazione Flutter Firebase .createUserWithEmailAndPassword: getGoogleApiForMethod () ha restituito Gms: com.google.firebase.auth.api.internal.zzao@fb1556c

Jan 04 2021

Preambolo

Questa è stata una lotta per un bel po 'ormai e nulla sembra funzionare, ho visto le risposte alle domande simili qui e qui , ma la prima non era in svolazzano e la seconda è stata pubblicata prima che le recenti modifiche al firebase_authe credo che la cosa più importante della le soluzioni proposte non hanno funzionato.

Il problema

Il problema riguarda una configurazione iniziale molto semplice dell'autenticazione Firebase all'interno di flutter. Ho impostato il mio progetto Firebase esattamente come suggerisce qui e ho usato questo e questo per impostare firebase_auth.

Il codice che causa il problema è il seguente:

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

Quando il codice viene eseguito l'errore

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

Viene restituito.

Questa risposta sembra suggerire che l'errore potrebbe essere irrilevante, cioè il codice potrebbe funzionare comunque. Ho inserito un punto di interruzione sulla linea UserCredential userCredential = await FirebaseAuth.instancee ho scavalcato, continua .createUserWithEmailAndPassword(, quindi una volta scavalcato di nuovo torna alla prima riga e viene visualizzato l'errore. Il superamento di qualsiasi ulteriore interruzione della funzione viene completamente interrotto, quindi la print(userCredential.user.email);riga non viene mai eseguita, il che suggerirebbe che il codice non funziona. Inoltre la print(e);riga nel catchnon è ciò che sta emettendo questo errore.

Altre informazioni

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

Anche questo errore è apparso alcune volte, anche se questa risposta sembra implicare che non ha nulla a che fare con il mio problema e non è indicativo di un problema.

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

MODIFICARE

Cambiare la linea onPressed: () => _registerTestUser(),in main.darta onPressed: () {_registerTestUser();}dà lo stesso risultato, ma cambia l'errore un po ', lo zzao @ fb1556c diventa zzao @ ebc85e9.

Risposte

GrahamD Jan 08 2021 at 19:24

Pur non rispondendo direttamente alla tua domanda e apparentemente in contrasto (anche se non molto diverso) con il codice di esempio FlutterFire. Ecco il codice che utilizzo per creare un utente (Firebase_auth Type User) e non vedo il tuo errore:

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

Posso quindi utilizzare metodi come await _user.sendEmailVerification();e accedere alle sue proprietà come _user.emailsenza problemi.

Forse prova quello invece delle credenziali.

PS. Il problema: a cui W/ConnectionTracker(19240): java.lang.IllegalArgumentException: Service not registered:ti riferisci viene tracciato qui e non credo che sia correlato al tuo codice:https://github.com/firebase/firebase-android-sdk/issues/1662#issue-638324848

Ha diverse varianti del codice di eccezione ma sono tutte correlate.

Aggiornamento Credo anche che @amit Kumar è quasi corretta, si esegueFirebaseAuth auth = FirebaseAuth.instance;primaFirebase.initializeApp();. Devi assicurarti che il tuo futuro sia completo prima di istanziare FirebaseAuth, credo. Probabilmente rende il mio codice modificato sopra irrilevante.

AmitKumar Jan 05 2021 at 00:17

Per prima cosa come posso vedere non hai inizializzato correttamente firebasenel main.dartfile.

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

Ti sei perso un'istruzione, prova di nuovo e se hai ancora problemi fammelo sapere

JamM.HernandezQuiceno Jan 12 2021 at 01:41

Provalo:

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

Considera anche l'utilizzo di User invece di 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);
        });
    }