我正在做一个项目,遇到了一个问题。我已经在 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)
我发现添加
options: DefaultFirebaseOptions.currentPlatform,
解决了问题
final Future<FirebaseApp> _initialization = Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
根本原因是两个问题之一
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