Flutter Firebase Auth Error .createUserWithEmailAndPassword: getGoogleApiForMethod () ส่งคืน Gms: com.google.firebase.auth.api.internal.zzao@fb1556c

Jan 04 2021

ปรารภ

นี้ได้รับการต่อสู้สำหรับการที่ดีในขณะนี้และไม่มีอะไรดูเหมือนว่าจะทำงานผมได้เห็นคำตอบของคำถามที่คล้ายกันที่นี่และที่นี่แต่อดีตไม่ได้อยู่ในกระพือและหลังถูกโพสต์ก่อนที่จะมีการเปลี่ยนแปลงล่าสุดไป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

คำตอบ

GrahamD Jan 08 2021 at 19:24

ในขณะที่ไม่ตอบคำถามของคุณโดยตรงและเห็นได้ชัดว่ามีความขัดแย้ง (แม้ว่าจะไม่แตกต่างกันมาก) กับโค้ดตัวอย่าง 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 ฉันเชื่อว่า อาจทำให้รหัสที่เปลี่ยนแปลงของฉันด้านบนไม่เกี่ยวข้อง

AmitKumar Jan 05 2021 at 00:17

ก่อนอื่นฉันเห็นว่าคุณไม่ได้เริ่มต้นfirebaseในmain.dartไฟล์อย่างถูกต้อง

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

คุณพลาดหนึ่งคำสั่งลองอีกครั้งและหากคุณยังคงพบปัญหาโปรดแจ้งให้เราทราบ

JamM.HernandezQuiceno Jan 12 2021 at 01:41

ลองดูสิ:

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