Flutter:没有创建 Firebase 应用程序“[DEFAULT]” - 当我流式传输 AUTH

问题描述 投票:0回答:2

我正在做一个项目,遇到了一个问题。我已经在 main.dart 中初始化了 Firebase,如下所示:

class _AppState extends State<App> {
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      // Initialize FlutterFire:
      future: _initialization,
      builder: (context, snapshot) {
        if (snapshot.hasError) {}

        if (snapshot.connectionState == ConnectionState.done) {
          return MaterialApp(
            routes: appRoutes,
            theme: appTheme,
          );
        }

        // return const MaterialApp(home: LoadingScreen());
        return const Directionality(
            textDirection: TextDirection.ltr, child: Text("Loading"));
      },
    );
  }

到目前为止,一切顺利,应用程序运行并且 firebase 按预期初始化。路线设置如下:

'/': (context) => const HomePage(),
'/login': (context) => const LoginPage(),

所以,我们自然会进入首页。这就是错误出现的地方。在主页上,我想监听流是否用户登录。问题是,当我初始化流时,出现以下错误:

[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()

这是主页的代码:

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: AuthService().userStream,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Text("loading");
        } else if (snapshot.hasError) {
          return const Center(
            child: Text("Error"),
          );
        } else if (snapshot.hasData) {
          return const ClientDashboardPage();
        } else {
          print("nodata");
          return const LoginPage();
        }
      },
    );
  }
}

这是授权文件:

import 'package:firebase_auth/firebase_auth.dart';

class AuthService {
  final userStream = FirebaseAuth.instance.authStateChanges();
  final user = FirebaseAuth.instance.currentUser;
}

所以我所做的就是监听流并抛出该错误。如果我删除整个主页并只添加文本,我就会看到该文本。所以错误显然来自 Auth Stream。我在网上搜索过有关此错误的信息,但大多数人说这是由于 firebase 未初始化所致。如果不是我的情况,我什至不会进入主页,因为这是在 main.dart 中检查的。

你们有什么解决方案/想法?非常感谢您的帮助!

这是完整的错误:

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

The relevant error-causing widget was
HomePage
routes.dart:7
When the exception was thrown, this was the stack
#0      MethodChannelFirebase.app
method_channel_firebase.dart:193
#1      Firebase.app
firebase.dart:56
#2      FirebaseAuth.instance
firebase_auth.dart:44
#3      new AuthService
auth.dart:4
#4      HomePage.build
home.dart:12
#5      StatelessElement.build
framework.dart:5367
#6      ComponentElement.performRebuild
framework.dart:5297
#7      Element.rebuild
framework.dart:5016
#8      ComponentElement._firstBuild
framework.dart:5279
#9      ComponentElement.mount
framework.dart:5273
...     Normal element mounting (220 frames)
#229    Element.inflateWidget
framework.dart:4182
#230    MultiChildRenderObjectElement.inflateWidget
framework.dart:6569
#231    MultiChildRenderObjectElement.mount
framework.dart:6581
...     Normal element mounting (435 frames)
#666    Element.inflateWidget
framework.dart:4182
#667    Element.updateChild
framework.dart:3701
#668    ComponentElement.performRebuild
framework.dart:5322
#669    StatefulElement.performRebuild
framework.dart:5462
#670    Element.rebuild
framework.dart:5016
#671    BuildOwner.buildScope
framework.dart:2779
#672    WidgetsBinding.drawFrame
binding.dart:916
#673    RendererBinding._handlePersistentFrameCallback
binding.dart:360
#674    SchedulerBinding._invokeFrameCallback
binding.dart:1297
#675    SchedulerBinding.handleDrawFrame
binding.dart:1227
#676    SchedulerBinding._handleDrawFrame
binding.dart:1085
#677    _invoke (dart:ui/hooks.dart:170:13)
flutter firebase google-cloud-firestore firebase-authentication
2个回答
0
投票

我发现添加

options: DefaultFirebaseOptions.currentPlatform,
解决了问题

final Future<FirebaseApp> _initialization = Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

0
投票

根本原因是两个问题之一

  • 确保您在使用 firebase 之前已致电
    Firebase.initializeApp
  • 或者您覆盖了默认名称以外的应用程序名称(这就是我的情况下的问题)

这个错误让我在 BrowserStack 上测试我的应用程序时遇到了困难。这是堆栈跟踪

app/ios/RunnerUITests/RunnerUITests.m:5: error: -[RunnerUITests example_test Navigation to Booking WebView test] : ((passed) is true) failed - [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() 
 #0      MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:195)
#1      Firebase.app (package:firebase_core/src/firebase.dart:79)
#2      FirebaseRemoteConfig.instance 

我们也在进行

Firebase.initializeApp
通话

await Firebase.initializeApp(
      options: FirebaseOptions(
        apiKey: dotenv.env['FIREBASE_API_KEY']!,
        appId: 'appID',
        projectId: 'my-sample-app',
        iosBundleId: 'com.sample.app.iphone',
      );,
   name: isTesting ? 'my-sample-app' : defaultFirebaseAppName,
    );

如您所见,isTesting 标志下的名称被覆盖为

my-sample-app

这就是问题所在,因为我们尝试使用

FirebaseRemoteConfig.instance

加载实例

结果它失败了,因为它不是默认名称。

/// The default Firebase application name.
const String defaultFirebaseAppName = '[DEFAULT]';

下面的代码检查要加载的默认 Firebase 应用程序,否则会引发异常

FirebaseAppPlatform app([String name = defaultFirebaseAppName]) {
    if (appInstances.containsKey(name)) {
      return appInstances[name]!;
    }

    throw noAppExists(name);
  }

因此请确保您没有覆盖该名称,除非您随后调用

FirebaseRemoteConfig.instanceFor(app: Firebase.app('my-sample-app')
而不是
FirebaseRemoteConfig.instance

© www.soinside.com 2019 - 2024. All rights reserved.