Flutter Firebase Auth Error .createUserWithEmailAndPassword: getGoogleApiForMethod () mengembalikan Gms: com.google.firebase.auth.api.internal.zzao@fb1556c

Jan 04 2021

Pembukaan

Ini telah menjadi perjuangan untuk sementara waktu sekarang dan sepertinya tidak ada yang berhasil, saya telah melihat jawaban untuk pertanyaan serupa di sini dan di sini tetapi yang pertama tidak berdebar-debar dan yang terakhir diposting sebelum perubahan terbaru ke firebase_authdan saya rasa yang paling penting adalah solusi yang diusulkan tidak berhasil.

Masalah

Masalahnya menyangkut penyiapan awal yang sangat sederhana dari autentikasi firebase dalam flutter. Saya telah menyiapkan proyek firebase saya persis seperti yang disarankan di sini dan menggunakan ini dan ini untuk menyiapkan firebase_auth.

Kode yang menyebabkan masalah adalah sebagai berikut:

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

Ketika kode dijalankan kesalahan

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

Dikembalikan.

Jawaban ini tampaknya menyarankan bahwa kesalahan mungkin tidak relevan, yaitu kode tetap dapat berfungsi. Saya meletakkan breakpoint pada garis UserCredential userCredential = await FirebaseAuth.instancedan melangkahi, itu berlanjut .createUserWithEmailAndPassword(, kemudian setelah melangkah lagi kembali ke baris pertama dan kesalahan ditampilkan. Melangkahi pemutusan lebih lanjut dari fungsi seluruhnya, sehingga print(userCredential.user.email);baris tidak pernah dijalankan, yang akan menunjukkan kode tidak berfungsi. Selain itu, print(e);baris di dalam catchbukan yang menghasilkan kesalahan ini.

Info lain

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

Juga kesalahan ini telah muncul beberapa kali, meskipun jawaban ini tampaknya menyiratkan bahwa itu tidak ada hubungannya dengan masalah saya dan tidak menunjukkan adanya masalah.

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

EDIT

Mengubah garis onPressed: () => _registerTestUser(),di main.dartuntuk onPressed: () {_registerTestUser();}memberikan hasil yang sama tapi perubahan kesalahan sedikit, yang zzao @ fb1556c menjadi zzao @ ebc85e9.

Jawaban

GrahamD Jan 08 2021 at 19:24

Meskipun tidak secara langsung menjawab pertanyaan Anda dan tampaknya berselisih (meskipun tidak terlalu berbeda dengan) dengan kode contoh FlutterFire. Berikut adalah kode yang saya gunakan untuk membuat pengguna (Jenis Pengguna Firebase_auth) dan saya tidak melihat kesalahan Anda:

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

Saya kemudian dapat menggunakan metode seperti await _user.sendEmailVerification();dan mengakses propertinya seperti _user.emailtanpa masalah.

Mungkin coba itu alih-alih kredensial.

PS. Masalah: yang W/ConnectionTracker(19240): java.lang.IllegalArgumentException: Service not registered:Anda maksud sedang dilacak di sini dan saya tidak yakin ini terkait dengan kode Anda:https://github.com/firebase/firebase-android-sdk/issues/1662#issue-638324848

Ini memiliki beberapa variasi kode pengecualian tetapi semuanya terkait.

Perbarui Saya juga percaya bahwa @amit kumar hampir benar, Anda menjalankanFirebaseAuth auth = FirebaseAuth.instance;sebelumnyaFirebase.initializeApp();. Anda perlu memastikan masa depan Anda selesai sebelum Anda membuat instance FirebaseAuth, saya yakin. Mungkin membuat kode yang saya ubah di atas tidak relevan.

AmitKumar Jan 05 2021 at 00:17

Pertama yang saya lihat Anda belum diinisialisasi firebasedalam main.dartberkas dengan benar.

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

Anda melewatkan satu pernyataan, coba lagi dan jika Anda masih mendapat masalah, beri tahu saya

JamM.HernandezQuiceno Jan 12 2021 at 01:41

Cobalah ini:

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

Pertimbangkan juga untuk menggunakan User, bukan 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);
        });
    }