Flutter Firebase Auth Error .createUserWithEmailAndPassword: getGoogleApiForMethod () ส่งคืน Gms: com.google.firebase.auth.api.internal.zzao@fb1556c
ปรารภ
นี้ได้รับการต่อสู้สำหรับการที่ดีในขณะนี้และไม่มีอะไรดูเหมือนว่าจะทำงานผมได้เห็นคำตอบของคำถามที่คล้ายกันที่นี่และที่นี่แต่อดีตไม่ได้อยู่ในกระพือและหลังถูกโพสต์ก่อนที่จะมีการเปลี่ยนแปลงล่าสุดไปfirebase_auth
และผมคิดว่าสิ่งที่สำคัญที่สุด วิธีแก้ปัญหาที่เสนอไม่ได้ผล
ปัญหา
ปัญหานี้เกี่ยวข้องกับการตั้งค่าการตรวจสอบสิทธิ์ firebase ในเบื้องต้นที่ง่ายมากภายในการกระพือปีก เราได้ตั้งโครงการ Firebase ฉันตรงตามที่มันแสดงให้เห็นที่นี่และใช้งานนี้และนี้firebase_auth
ในการตั้งค่า
รหัสที่ทำให้เกิดปัญหามีดังนี้:
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);
}
}
เมื่อรหัสถูกเรียกใช้ข้อผิดพลาด
I / BiChannelGoogleApi (19546): [FirebaseAuth:] getGoogleApiForMethod () ส่งคืน Gms: com.google.firebase.auth.api.internal.zzao@fb1556c
ถูกส่งกลับ.
คำตอบนี้ดูเหมือนจะชี้ให้เห็นว่าข้อผิดพลาดอาจไม่เกี่ยวข้องกันกล่าวคือโค้ดอาจใช้งานได้อยู่ดี ฉันวางเบรกพอยต์บนเส้นUserCredential userCredential = await FirebaseAuth.instance
แล้วก้าวข้ามมันไปต่อ.createUserWithEmailAndPassword(
จากนั้นเมื่อก้าวข้ามอีกครั้งกลับไปที่บรรทัดแรกและข้อผิดพลาดจะปรากฏขึ้น การก้าวข้ามส่วนเพิ่มเติมใด ๆ ออกจากฟังก์ชันทั้งหมดดังนั้นprint(userCredential.user.email);
บรรทัดจะไม่ถูกดำเนินการซึ่งจะแนะนำว่าโค้ดไม่ทำงาน นอกจากนี้print(e);
บรรทัดในcatch
ไม่ใช่สิ่งที่แสดงข้อผิดพลาดนี้
ข้อมูลอื่น ๆ
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,
),
],
),
),
);
}
}
นอกจากนี้ข้อผิดพลาดนี้ยังปรากฏขึ้นสองสามครั้งแม้ว่าคำตอบนี้ดูเหมือนจะบ่งบอกว่าไม่มีส่วนเกี่ยวข้องกับปัญหาของฉันและไม่ได้บ่งบอกถึงปัญหา
W / ConnectionTracker (19240): java.lang.IllegalArgumentException: บริการไม่ได้ลงทะเบียน: lp @ fb1556c W / ConnectionTracker (19240): ที่ android.app.LoadedApk. 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)
แก้ไข
การเปลี่ยนบรรทัดonPressed: () => _registerTestUser(),
ในmain.dart
เพื่อonPressed: () {_registerTestUser();}
ให้ผลลัพธ์เหมือนกัน แต่เปลี่ยนข้อผิดพลาดเล็กน้อย zzao @ fb1556c กลายเป็น zzao @ ebc85e9
คำตอบ
ในขณะที่ไม่ตอบคำถามของคุณโดยตรงและเห็นได้ชัดว่ามีความขัดแย้ง (แม้ว่าจะไม่แตกต่างกันมาก) กับโค้ดตัวอย่าง FlutterFire นี่คือรหัสที่ฉันใช้สร้างผู้ใช้ (ผู้ใช้ประเภท Firebase_auth) และฉันไม่เห็นข้อผิดพลาดของคุณ:
User _user = (await _firebaseAuth.createUserWithEmailAndPassword(
email: email,
password: password,
)).user;
จากนั้นฉันสามารถใช้วิธีการเช่นawait _user.sendEmailVerification();
และเข้าถึงคุณสมบัติของมันเช่น_user.email
ไม่มีปัญหา
อาจลองใช้แทนข้อมูลรับรอง
ปล. ปัญหา: W/ConnectionTracker(19240): java.lang.IllegalArgumentException: Service not registered:
คุณอ้างถึงกำลังถูกติดตามที่นี่และฉันไม่เชื่อว่ามันเกี่ยวข้องกับรหัสของคุณ:https://github.com/firebase/firebase-android-sdk/issues/1662#issue-638324848
มีรหัสข้อยกเว้นหลายรูปแบบ แต่เกี่ยวข้องกันทั้งหมด
อัปเดตฉันยังเชื่อว่า @amit kumar เกือบถูกต้องคุณกำลังทำงานอยู่FirebaseAuth auth = FirebaseAuth.instance;
ก่อนหน้าFirebase.initializeApp();
นี้ คุณต้องแน่ใจว่าอนาคตของคุณจะเสร็จสมบูรณ์ก่อนที่จะสร้างอินสแตนซ์ FirebaseAuth ฉันเชื่อว่า อาจทำให้รหัสที่เปลี่ยนแปลงของฉันด้านบนไม่เกี่ยวข้อง
ก่อนอื่นฉันเห็นว่าคุณไม่ได้เริ่มต้นfirebase
ในmain.dart
ไฟล์อย่างถูกต้อง
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
คุณพลาดหนึ่งคำสั่งลองอีกครั้งและหากคุณยังคงพบปัญหาโปรดแจ้งให้เราทราบ
ลองดูสิ:
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);
}
}
ลองพิจารณาใช้ User แทน 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);
});
}