Erreur d'authentification Flutter Firebase .createUserWithEmailAndPassword: getGoogleApiForMethod () a renvoyé Gms: com.google.firebase.auth.api.internal.zzao@fb1556c
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_auth
et 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.instance
et 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 catch
n'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.dart
la onPressed: () {_registerTestUser();}
donne le même résultat , mais l'erreur change légèrement, le zzao @ fb1556c devient zzao @ ebc85e9.
Réponses
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.email
sans 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.
Tout d'abord, comme je peux le voir, vous n'avez pas initialisé correctement firebase
dans le main.dart
fichier.
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
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);
}
}
final FirebaseAuth _auth = FirebaseAuth.instance;
registerUser()async{
_auth.createUserWithEmailAndPassword(
email:"[email protected]",
password: "SuperSecretPassword!",
).then((result){
User user = result.user;
}).catchError((e) {
print(e);
});
}