【问题标题】:Flutter: Unable to Firebase.initializeApp() Firebase authentication servicesFlutter:无法 Firebase.initializeApp() Firebase 身份验证服务
【发布时间】:2021-01-12 22:31:26
【问题描述】:

创建了一个新类来在一个地方管理登录方法,一个没有 Flutter Widget 的 Dart 类。

在关注https://firebase.flutter.dev/docs/overview/#initializing-flutterfire. 之后,它会给出关于 FIREBASE INITIALIZATION 的错误

错误:没有创建 Firebase 应用“[DEFAULT]” - 调用 Firebase.initializeApp()。 _firebaseAuth 没有它就毫无用处。

完整示例项目在这里:https://github.com/dashanan13/time_tracker_flutter_course.git

请帮忙,这很令人沮丧。

堆栈跟踪:

Launching lib\main.dart on Android SDK built for x86 in debug mode...
Running Gradle task 'assembleDebug'...
Parameter format not correct -
✓ Built build\app\outputs\flutter-apk\app-debug.apk.
Installing build\app\outputs\flutter-apk\app.apk...
Waiting for Android SDK built for x86 to report its views...
Debug service listening on ws://127.0.0.1:60201/mhWPMlMla50=/ws
Syncing files to device Android SDK built for x86...
E/GraphResponse(20120): {HttpStatus: 404, errorCode: 803, subErrorCode: -1, errorType: OAuthException, errorMessage: (#803) Cannot query users by their username (CHANGE-ME)}
E/GraphResponse(20120): {HttpStatus: 404, errorCode: 803, subErrorCode: -1, errorType: OAuthException, errorMessage: (#803) Cannot query users by their username (CHANGE-ME)}
W/AnalyticsUserIDStore(20120): initStore should have been called before calling setUserID
W/UserDataStore(20120): initStore should have been called before calling setUserID
D/EGL_emulation(20120): eglMakeCurrent: 0xd731a9c0: ver 2 0 (tinfo 0xd730f730)
E/GraphResponse(20120): {HttpStatus: 404, errorCode: 803, subErrorCode: -1, errorType: OAuthException, errorMessage: (#803) Cannot query users by their username (CHANGE-ME)}
I/OpenGLRenderer(20120): Davey! duration=2122ms; Flags=1, IntendedVsync=172506915033871, Vsync=172506948367203, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=172506964470903, AnimationStart=172506964518803, PerformTraversalsStart=172506964557703, DrawStart=172508239012703, SyncQueued=172508239844803, SyncStart=172508241475003, IssueDrawCommandsStart=172508241758403, SwapBuffers=172508678528903, FrameCompleted=172509039559203, DequeueBufferDuration=21745000, QueueBufferDuration=142000, 
I/Choreographer(20120): Skipped 129 frames!  The application may be doing too much work on its main thread.
E/GraphResponse(20120): {HttpStatus: 404, errorCode: 803, subErrorCode: -1, errorType: OAuthException, errorMessage: (#803) Cannot query users by their username (CHANGE-ME)}
I/asics_for_dars(20120): Background young concurrent copying GC freed 26775(1377KB) AllocSpace objects, 9(360KB) LOS objects, 41% free, 2468KB/4219KB, paused 131.474ms total 1.416s
D/EGL_emulation(20120): eglMakeCurrent: 0xea67f940: ver 2 0 (tinfo 0xd3e265e0)

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following FirebaseException was thrown building LandingPage(dirty, dependencies:
[InheritedProvider<AuthBase>]):
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()

The relevant error-causing widget was:
  LandingPage
  file:///C:/Users/.../basics_for_darsh/lib/main.dart:68:41

When the exception was thrown, this was the stack:
#0      MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5)
#1      Firebase.app (package:firebase_core/src/firebase.dart:52:41)
#2      FirebaseAuth.instance (package:firebase_auth/src/firebase_auth.dart:37:47)
#3      Auth.onAuthStateChanged (package:basics_for_darsh/utilities/auth.dart:47:35)
#4      LandingPage.build (package:basics_for_darsh/utilities/landingPage.dart:18:22)
#5      StatelessElement.build (package:flutter/src/widgets/framework.dart:4620:28)
#6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4546:15)
#7      Element.rebuild (package:flutter/src/widgets/framework.dart:4262:5)
#8      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4525:5)
#9      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4520:5)
...     Normal element mounting (132 frames)
#141    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3490:14)
#142    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5991:32)
...     Normal element mounting (287 frames)
#429    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3490:14)
#430    Element.updateChild (package:flutter/src/widgets/framework.dart:3258:18)
#431    RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1174:16)
#432    RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1145:5)
#433    RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:1087:17)
#434    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2620:19)
#435    RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1086:13)
#436    WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:927:7)
#437    WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:908:7)
(elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)

════════════════════════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following FirebaseException was thrown building LandingPage(dirty, dependencies: [InheritedProvider<AuthBase>]):
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()

The relevant error-causing widget was: 
  LandingPage file:///C:/Users/.../basics_for_darsh/lib/main.dart:68:41
When the exception was thrown, this was the stack: 
#0      MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5)
#1      Firebase.app (package:firebase_core/src/firebase.dart:52:41)
#2      FirebaseAuth.instance (package:firebase_auth/src/firebase_auth.dart:37:47)
#3      Auth.onAuthStateChanged (package:basics_for_darsh/utilities/auth.dart:47:35)
#4      LandingPage.build (package:basics_for_darsh/utilities/landingPage.dart:18:22)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
E/GraphResponse(20120): {HttpStatus: 404, errorCode: 803, subErrorCode: -1, errorType: OAuthException, errorMessage: (#803) Cannot query users by their username (CHANGE-ME)}
E/GraphResponse(20120): {HttpStatus: 404, errorCode: 803, subErrorCode: -1, errorType: OAuthException, errorMessage: (#803) Cannot query users by their username (CHANGE-ME)}

Firebase 身份验证在没有初始化的情况下是没有用的。 错误:[core/no-app] 没有创建 Firebase 应用“[DEFAULT]” - 调用 Firebase.initializeApp() 请帮忙。

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
import 'package:google_sign_in/google_sign_in.dart';

class MyUser {
  MyUser({@required this.uid});
  final String uid;
}

abstract class AuthBase {
  Stream<MyUser> get onAuthStateChanged;
  Future<MyUser> currentUser();
  Future<MyUser> signInAnonymously();
  Future<MyUser> signInWithGoogle();
  Future<void> signOut();
}

class Auth implements AuthBase {

  var _initialization,_firebaseAuth;

  Auth(){
    _intializeMe();
    _firebaseAuth =  FirebaseAuth.instance;
  }

  _intializeMe() async {
    FirebaseApp _initialization = (await Firebase.initializeApp());
  }

  MyUser _userFromFirebase(User user) {
    if (user == null) {
      return null;
    }
    return MyUser(uid: user.uid);
  }

  @override
  Stream<MyUser> get onAuthStateChanged {
    return _firebaseAuth.authStateChanges().map(_userFromFirebase);
  }

  @override
  Future<MyUser> currentUser() async {
    final user = await _firebaseAuth.currentUser;
    return _userFromFirebase(user);
  }

  @override
  Future<MyUser> signInAnonymously() async {

final authResult = await _firebaseAuth.signInAnonymously();
return _userFromFirebase(authResult.user);
  }

  @override
  Future<MyUser> signInWithGoogle() async {
final googleSignIn = GoogleSignIn();
final googleAccount = await googleSignIn.signIn();
if (googleAccount != null) {
  final googleAuth = await googleAccount.authentication;
  if (googleAuth.accessToken != null && googleAuth.idToken != null) {
    final authResult = await _firebaseAuth.signInWithCredential(
      GoogleAuthProvider.credential(
        idToken: googleAuth.idToken,
        accessToken: googleAuth.accessToken,
      ),
    );
    return _userFromFirebase(authResult.user);
  } else {
    throw PlatformException(
      code: 'ERROR_MISSING_GOOGLE_AUTH_TOKEN',
      message: 'Missing Google Auth Token',
    );
  }
} else {
  throw PlatformException(
    code: 'ERROR_ABORTED_BY_USER',
    message: 'Sign in aborted by user',
  );
}
  }


  @override
  Future<void> signOut() async {
    final googleSignIn = GoogleSignIn();
    await googleSignIn.signOut();
    final facebookLogin = FacebookLogin();
    await facebookLogin.logOut();
    await _firebaseAuth.signOut();
  }
}

调用 Auth() 方法

import 'dart:async';

import 'package:basics_for_darsh/authentication/signin.dart';
import 'package:basics_for_darsh/screens/welcome_screen.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'auth.dart';

class LandingPage extends StatelessWidget {
  static const String id = 'landing_page';
  @override
  Widget build(BuildContext context) {

    final auth = Provider.of<AuthBase>(context);

    return StreamBuilder<MyUser>(
        stream: auth.onAuthStateChanged,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.active) {
            MyUser user = snapshot.data;
            if (user == null) {
              return AppSignIn();
            }
            return WelcomeScreen();
          } else {
            return Scaffold(
              body: Center(
                child: CircularProgressIndicator(),
              ),
            );
          }
        });
  }
}

【问题讨论】:

  • 我正在尝试创建一个单独的身份验证类,该类具有各种类型的身份验证作为函数,如 signInAnonymously() 和 onAuthStateChanged()。目的是在一个地方管理它们并通过提供程序使用它们,这个类中没有 UI 组件,它纯粹是一个 Dart 类。不幸的是,每次编译都会导致相同的错误:没有创建 Firebase App '[DEFAULT]' - 调用 Firebase.initializeApp()。我试图在构造函数中对其进行初始化,将其分配给构造函数外部的变量等,但错误不会消失,我无法使用 _firebaseAuth。
  • 请不要向 cmets 添加额外信息。而是:单击问题下方的编辑链接,将此类信息添加到问题本身。
  • 除此之外:错误消息的堆栈跟踪将显示您在代码中调用的位置
  • 你在哪里打电话Auth()
  • @FrankvanPuffelen 评论中的信息只是改写的信息,试图再次解释同一件事,我无法放入主要描述,因为它一直与stackoverflow.com/questions/63492211/…合并。

标签: firebase flutter dart firebase-authentication


【解决方案1】:

initializeApp() 是异步的,因此请执行以下操作:

  Auth(){
    _intializeMe().then((_){
    _firebaseAuth =  FirebaseAuth.instance;
   });
  }

  Future<void> _intializeMe() async {
    return await Firebase.initializeApp();
  }

在访问 FirebaseAuth 之前,您必须初始化 Firebase。因此,您可以使用then(),它将注册一个回调,该回调将在未来完成时调用。

【讨论】:

  • 它给了我另一个错误,即在 NULL 上调用该方法,就好像它没有等待它被初始化一样。在构建 LandingPage(dirty, dependencies: [InheritedProvider]) 时引发了以下 NoSuchMethodError:在 null 上调用了方法“authStateChanges”。接收方:null 尝试调用:authStateChanges()
  • 该回调应该做什么?
  • initializeMe 返回一个Future,因此您可以使用then() 方法接受回调。当initializeMe 返回时,将调用回调。您设置_firebaseAuth 的代码将被称为@mLstudent33
  • 我已经在顶级应用程序的 initState() 中调用的异步方法中调用了 await Firebase.initializeApp();,并为身份验证部分提供了 Riverpod 提供程序,并且能够在移动设备上登录。在网络上,仍然得到FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - call Firebase App.initializeApp() (app/no-app). 我在这里完成了所有步骤:firebase.flutter.dev/docs/installation/web
  • 我不见了:// Initialize Firebase firebase.initializeApp(firebaseConfig); 来自网络 index.html firebase.flutter.dev/docs/installation/web
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2020-09-25
  • 2018-05-22
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2021-06-10
相关资源
最近更新 更多