Erro de autenticação do Flutter Firebase .createUserWithEmailAndPassword: getGoogleApiForMethod () retornou Gms: com.google.firebase.auth.api.internal.zzao@fb1556c
Preâmbulo
Esta tem sido uma luta por um bom tempo e nada parece estar funcionando. Eu vi respostas para perguntas semelhantes aqui e aqui, mas a primeira não estava agitada e a última foi postada antes das mudanças recentes para firebase_auth
e acho que o mais importante, as soluções propostas não funcionaram.
O problema
O problema diz respeito a uma configuração inicial muito simples de autenticação do firebase no flutter. Eu configurei meu projeto Firebase exatamente como sugere aqui e usei isso e isso para configurar firebase_auth
.
O código que está causando o problema é o seguinte:
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 o código é executado, o erro
I / BiChannelGoogleApi (19546): [FirebaseAuth:] getGoogleApiForMethod () retornou Gms: com.google.firebase.auth.api.internal.zzao@fb1556c
É devolvido.
Essa resposta parece sugerir que o erro pode ser irrelevante, ou seja, o código pode funcionar de qualquer maneira. Eu coloquei um ponto de interrupção na linha UserCredential userCredential = await FirebaseAuth.instance
e passei por cima, ele continua .createUserWithEmailAndPassword(
, então, uma vez que passei novamente, volto para a primeira linha e o erro é exibido. Passar por cima de qualquer outra parte interrompe totalmente a função, de modo que a print(userCredential.user.email);
linha nunca seja executada, o que sugere que o código não está funcionando. Além disso, a print(e);
linha em catch
não é o que está gerando esse erro.
Outras informações
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,
),
],
),
),
);
}
}
Além disso, esse erro apareceu algumas vezes, embora essa resposta pareça implicar que não tem nada a ver com o meu problema e não é indicativo de um problema.
W / ConnectionTracker (19240): java.lang.IllegalArgumentException: Serviço não registrado: lp @ fb1556c W / ConnectionTracker (19240): em android.app.LoadedApk.forgetServiceDispatcher (LoadedApk.java:1729) W / ConnectionTracker (19240): em android.app.ContextImpl.unbindService (ContextImpl.java:1874) W / ConnectionTracker (19240): em android.content.ContextWrapper.unbindService (ContextWrapper.java:792) W / ConnectionTracker (19240): em ci.f (: com .google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 1) W / ConnectionTracker (19240): em ci.d (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 2) W / ConnectionTracker (19240): em lq.D (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 10) W / ConnectionTracker (19240) : em lc.a (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 2) W / ConnectionTracker (19240): em ee.run (: com.google.android.gms .dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 3) W / ConnectionTracker (19240): em java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:462) W / ConnectionTracker (19240): em java.util.concurrent.FutureTask.run (FutureTask.java: 266) W / ConnectionTracker (19240): em ix.run (: com.google.android.gms.dynamite_measurementdynamite @ 204217100 @ 20.42.17 (150700-0): 6)
EDITAR
Alterando a linha onPressed: () => _registerTestUser(),
em main.dart
que onPressed: () {_registerTestUser();}
dá o mesmo resultado, mas muda o erro ligeiramente, a zzao @ fb1556c se torna zzao @ ebc85e9.
Respostas
Embora não responda diretamente à sua pergunta e esteja aparentemente em desacordo (embora não muito diferente) com o código de amostra FlutterFire. Este é o código que uso para criar um usuário (Firebase_auth Type User) e não vejo seu erro:
User _user = (await _firebaseAuth.createUserWithEmailAndPassword(
email: email,
password: password,
)).user;
Posso então usar métodos como await _user.sendEmailVerification();
e acessar suas propriedades _user.email
sem problemas.
Talvez tente isso em vez da credencial.
PS. O problema a que W/ConnectionTracker(19240): java.lang.IllegalArgumentException: Service not registered:
você se refere está sendo rastreado aqui e não acredito que esteja relacionado ao seu código:https://github.com/firebase/firebase-android-sdk/issues/1662#issue-638324848
Possui diversas variações de código de exceção, mas todas estão relacionadas.
Atualização Também acredito que @amit kumar está quase correto, você já rodouFirebaseAuth auth = FirebaseAuth.instance;
antesFirebase.initializeApp();
. Você precisa ter certeza de que seu futuro será concluído antes de instanciar FirebaseAuth, eu acredito. Provavelmente torna meu código alterado acima irrelevante.
Primeiro de quanto eu posso ver você não tenha inicializado firebase
no main.dart
arquivo corretamente.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
Você perdeu uma declaração, tente novamente e se ainda tiver problemas, me avise
Experimente:
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);
}
}
Considere também o uso de User em vez 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);
});
}