我正在构建一个 Flutter 应用程序并且我已经集成了 Firebase,但是当我单击一个按钮进行注册、登录或注销时,我不断收到这个错误。我见过其他人问过同样的问题,但似乎没有一个对我有用。我正在使用 Flutter 和 Android Studio。我该如何解决这个问题?
这是我的代码的摘录
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.red,
body: Center(
child: Container(
child: RaisedButton(
onPressed: () {
FirebaseAuth.instance.signOut().then((value) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) =>
LoginScreen()));
});
},
child: Text("Logout"),
)
)
)
);
}
}
下面是抛出的异常
══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
The following FirebaseException was thrown while handling a gesture:
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
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 _HomeScreenState.build.<anonymous closure> (package:cosytok/screens/home.dart:20:28)
#4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
#5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1098:38)
#6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
#7 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
#8 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
#9 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:219:7)
#10 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:477:9)
#11 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:78:12)
#12 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:124:9)
#13 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#14 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:122:18)
#15 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:108:7)
#16 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:220:19)
#17 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
#18 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
#19 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
#20 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
#24 _invoke1 (dart:ui/hooks.dart:267:10)
#25 _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
(elided 3 frames from dart:async)
Handler: "onTap"
Recognizer:
TapGestureRecognizer#f0104
════════════════════════════════════════════════════════════════════════════════════════════════════
════════ Exception caught by gesture ═══════════════════════════════════════════════════════════════
The following FirebaseException was thrown while handling a gesture:
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
从 2020 年 8 月 17 日开始
所有 Firebase 版本都已更新,现在您必须在使用任何 Firebase 产品之前调用 Firebase.initializeApp()
,例如:
首先,所有 Firebase 产品现在都依赖于 firebase_core
版本 (0.5.0+),因此您需要将其添加到 pubspec.yaml
文件中:
dependencies:
flutter:
sdk: flutter
firebase_core : ^0.5.0
# cloud_firestore: ^0.14.0 other firebase dependencies
然后您必须调用 Firebase.initializeApp()
:
第一个例子
import 'package:flutter/material.dart';
// Import the firebase_core plugin
import 'package:firebase_core/firebase_core.dart';
void main() {
runApp(App());
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
// Initialize FlutterFire
future: Firebase.initializeApp(),
builder: (context, snapshot) {
// Check for errors
if (snapshot.hasError) {
return SomethingWentWrong();
}
// Once complete, show your application
if (snapshot.connectionState == ConnectionState.done) {
return MyAwesomeApp();
}
// Otherwise, show something whilst waiting for initialization to complete
return Loading();
},
);
}
}
Firestore 的第二个示例:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: FirstRoute(title: 'First Route'),
);
}
}
class FirstRoute extends StatefulWidget {
FirstRoute({Key key, this.title}) : super(key: key);
final String title;
@override
_FirstRouteState createState() => _FirstRouteState();
}
class _FirstRouteState extends State<FirstRoute> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("test"),
),
body: FutureBuilder(
future: getData(),
builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Column(
children: [
Container(
height: 27,
child: Text(
"Name: ${snapshot.data.data()['name']}",
overflow: TextOverflow.fade,
style: TextStyle(fontSize: 20),
),
),
],
);
} else if (snapshot.connectionState == ConnectionState.none) {
return Text("No data");
}
return CircularProgressIndicator();
},
));
}
Future<DocumentSnapshot> getData() async {
await Firebase.initializeApp();
return await FirebaseFirestore.instance
.collection("users")
.doc("docID")
.get();
}
}
第三个例子:
在 initState()
中对其进行初始化,然后调用将调用 build()
方法的 setState()
。
@override
void initState() {
super.initState();
Firebase.initializeApp().whenComplete(() {
print("completed");
setState(() {});
});
}
第四个例子:
调用 WidgetsFlutterBinding.ensureInitialized();
后在 main()
方法中对其进行初始化
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
注意:您只需调用一次 initializeApp()
添加到 pubspec.yaml firebase_core :添加到 main.dart import 'package:firebase_core/firebase_core.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized();等待 Firebase.initializeApp();运行应用程序(我的应用程序()); }
initializeApp()
是异步调用,所以即使失败,应用程序仍会启动
如果您遵循 Peter's answer 并且仍然遇到相同的错误,请检查以确保 main
函数中的其他内容出现在 await Firebase.initializeApp()
调用之后,如下所示:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
runApp(MyApp());
}
自 2017 年 8 月以来,所有 Firebase 服务都已更新,因此您必须先在 main 中调用 Firebase.initializeApp(),然后才能使用任何 Firebase 产品,例如:
如果你想在 Flutter 应用程序中使用 firebase_core 插件,那么在你的 pubspec.yaml 文件中添加 firebase_core 如下
dependencies:
flutter:
sdk: flutter
firebase_core: ^1.19.1
然后在您的应用中调用 Firebase.initializeApp():。与以下内容相同:
import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
首先,添加这个依赖:
firebase_core :
第二:在项目主函数中,添加这两行并使函数异步:
void main() async {
// These two lines
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
//
runApp(MyApp());
}
现在您可以在项目中的任何文件或小部件中正常使用 Firebase。
FutureBuilder 小部件也可以使用,但您必须在每次要访问 Firebase 时添加它。
Peter's answer 完美!!但是如果您的代码中仍然出现错误并遵循 Flutter Firebase codelab,请注意,这些教程截至 2020 年 8 月已过时且尚未更新。
您需要进行许多其他更改,例如:
用 .data() 替换 .data
用更新替换 updateData
Flutter Web 与 Firebase
如果您将 Flutter Web 与 Firebase 一起使用,请确保您在 ./web/index.html
的 body
标记中安装了 SDK
<script src="https://www.gstatic.com/firebasejs/8.2.9/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.2.9/firebase-analytics.js"></script>
此外,请确保您也使用 index.html
中的配置参数调用 firebase.initializeApp(...)
。
<script>
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
var firebaseConfig = {
apiKey: "AIz...",
authDomain: "...",
databaseURL: "https://<project-name>.firebaseio.com",
projectId: "...",
storageBucket: "<project-name>.appspot.com",
messagingSenderId: "...",
appId: "...",
measurementId: "..."
};
firebase.initializeApp(firebaseConfig);
firebase.analytics();
</script>
最后按照 Peter Haddad's answer 中的说明配置 firebase:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
仅 Dart 初始化(推荐)
使用 CLI 在所有平台上初始化 Firebase。
无需添加任何本机代码。
无需下载任何 Google 服务文件。
安装 FlutterFire CLI dart pub global activate flutterfire_cli (可选)将以下行添加到 ~/.zshrc 文件并保存 export PATH="$PATH":"$HOME/.pub-cache/bin" 运行配置:flutterfire configure按回车键配置所有平台您现在应该有一个 lib/firebase_options.dart 文件。将此文件导入您的 main.dart 并使用 Firebase.initializeApp。导入“firebase_options.dart”; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 这是您需要添加的最后一件事。等待 Firebase.initializeApp( 选项: DefaultFirebaseOptions.currentPlatform, );运行应用程序(...); }
迁移到仅 Dart 初始化:
如果您已经有一个现有的应用程序,您可以通过以下方式进行迁移。
Android:从
从
删除
删除
iOS 在 Xcode 中打开
macOS 在 Xcode 中打开
可以找到更多信息here
您需要添加 await Firebase.initializeApp();
,它是一个 Future
。在运行 Firebase 函数的 dart 文件中执行此操作,如下所示:
import 'package:firebase_core/firebase_core.dart';
...
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MaterialApp());
}
从 Flutter 2.8 版本开始,FlutterFire 现在可以在所有平台上使用 Firebase.initializeApp 函数从 Dart 初始化。有一种更简单、更快捷的方式来初始化 firebase 项目,而不是从 firebase 控制台下载 .json 和 .plist 文件并将它们放入您的 Flutter 项目文件夹中,这可能会导致多个警告。这是我多次遇到的问题,这就是我解决它的方法。
在 Firebase 控制台 steps here 中创建项目并安装 Firebase CLI here 后,请继续执行以下步骤:
如果您已经使用 flutterfire configure 配置了 Firebase 项目,则可以跳过第 1 步并跳到第 4 步。
从您的项目根终端,命令: $ flutterfire configure // 这需要 Firebase CLI 才能工作。按回车键或回车键选择 firebase 项目。插入捆绑包 ID。您可以通过右键单击 ios 文件夹 > 然后单击“在 xcode 中打开”来获取此信息。 Bundle Identifier 将出现在右侧的白色面板中,当出现提示时,您必须在终端中手动输入。
** 如果您已经安装了 firebase_core 插件,请继续执行第 5 步。 **
通过从项目根目录运行以下命令来安装最新版本的 firebase_core 插件: $ flutter pub add firebase_core // 添加到 pubspec.yaml 将导入添加到主文件: import 'package:firebase_core/firebase_core.dart'; // 导入 'firebase_options.dart'; // 生成的文件 更新您的主函数以使用此异步函数初始化 firebase:Future
See the FlutterFire documentation for more information.
如果您将应用程序留在主屏幕时仍然存在问题,您可以使用 Firebase 将其添加到任何 .dart
文件中:
class App extends StatelessWidget {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
或者在 StatefulWidget
的情况下:
import 'package:flutter/material.dart';
// Import the firebase_core plugin
import 'package:firebase_core/firebase_core.dart';
void main() {
runApp(App());
}
class App extends StatefulWidget {
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
// Set default `_initialized` and `_error` state to false
bool _initialized = false;
bool _error = false;
// Define an async function to initialize FlutterFire
void initializeFlutterFire() async {
try {
// Wait for Firebase to initialize and set `_initialized` state to true
await Firebase.initializeApp();
setState(() {
_initialized = true;
});
} catch(e) {
// Set `_error` state to true if Firebase initialization fails
setState(() {
_error = true;
});
}
}
@override
void initState() {
initializeFlutterFire();
super.initState();
}
@override
Widget build(BuildContext context) {
// Show error message if initialization failed
if(_error) {
return SomethingWentWrong();
}
// Show a loader until FlutterFire is initialized
if (!_initialized) {
return Loading();
}
return MyAwesomeApp();
}
}
有关详细信息,请查看 this link。
No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
。我已经在有状态小部件中初始化了 Firebase。
这是2022年初始化firebase的方式
首先,用这个链接安装 FlutterFire ==> Flutter Fire Installation Link
安装 FlutterFire 后,您需要在 lib/main.dart 文件中添加这些代码行
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
然后编辑您的主要功能,如下所示
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options:
DefaultFirebaseOptions.currentPlatform,);
runApp(MyApp());
}
这可能会在未来发生变化,因此请参阅此链接以获取下面的最新实施参考
我需要使用 FlutterFire cli 重新配置 Firebase 应用程序。
https://firebase.flutter.dev/docs/cli
通过 NPM 安装 firebase-tool:npm install -g firebase-tools 安装 flutterfire cli:dart pub global activate flutterfire_cli 运行以下命令在项目中配置 firebase:flutterfire configure
按照上面的链接,初始化如下:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
runApp(const MyApp());
}
作为它的等待调用,该应用程序将显示初始屏幕并且 Firebase 可能无法初始化,因此我接下来继续使用另一个 FutureBuilder for home
屏幕,以确保在我使用 FirebaseAuth 之前初始化 Firebase 应用程序。
home: FutureBuilder(
future: Firebase.initializeApp(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text(snapshot.error.toString(),
style: TextStyle(fontSize: 10));
}
if (snapshot.connectionState == ConnectionState.done) {
return StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
return snapshot.hasData ? Home() : AuthPage();
},
);
} else {
return Text('');
}
})
就我而言,这是因为对于 Web 版本,您必须在 index.html 文件中手动添加内容,不仅是 .js 依赖项,还有配置。请参阅 Web Installation。
我们往往会忘记,对于大多数东西来说,Flutter 是编译到目标的,而不需要更改任何特定于目标的东西,但在这种情况下,必须为每个目标添加配置。
您可以使用 FutureBuilder 在 main.dart 文件中进行初始化,也可以像这样进行初始化。
future: Firebase.initializeApp(),
看看这个例子。
void main() {
runApp(App());
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
// Initialize FlutterFire
future: Firebase.initializeApp(),
builder: (context, snapshot) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'NEWSAPI.org',
home: SplashScreen(),
routes: <String, WidgetBuilder>{
SPLASH_SCREEN: (BuildContext context) => SplashScreen(),
},);
},
);
}
}
将其用于颤振:
const firebaseConfig = {
apiKey: "",
authDomain: "",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: "",
measurementId: ""
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
firebase.getAnalytics(app);
而不是这个
const firebaseConfig = {
apiKey: "",
authDomain: "",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: "",
measurementId: ""
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
您需要在主函数中添加 await FirebaseApp.initializeApp()
记得在主函数中添加等待
如果您已正确设置 Firebase,请不要忘记添加
等待
前
Firebase.initializeApp();
这主要是那个异常的问题。
等待 Firebase.initializeApp();
就我而言,我在现有项目中添加了 Web 支持。解决问题的一件事是,
在 web/index.html
文件中
将所有 firebase sdk 导入的 verison
从 9.6.6
更改为 8.10.0
片段
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app-check.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-storage.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-messaging.js"></script>
<script>
var firebaseConfig = {
....
}
我想发表评论。但是这个问题有很多线索。对于我的情况。
我在 Firebase 之前初始化了注入容器。需要检查层次结构。
Hive.init(directory.path);
await Firebase.initializeApp();// before
await di.init();
使用 firebase 选项初始化
void main() async{
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform).catchError((e){
print(" Error : ${e.toString()}");
});
}
像这样
如果您正在处理预先配置了 firebase_core 的项目,然后您尝试添加新包,则会出现该错误。
您必须先从 pubsec.yaml 中删除 firebase_core:
,然后保存文件并通过 flutter pub add firebase_core
重新配置它,然后再通过 flutterfire configure
。
然后你可以添加任何新的包。
对我来说,问题是我在没有“等待”的情况下对其进行了初始化:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
Firebase.initializeApp();
正确的方法是:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
ensureInitislized
时,它会创建Widgetbinding
的实例,并且由于Firebase.initializeApp()
需要使用平台通道来调用本机,因此您需要初始化绑定。 api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/…(平台频道在颤振引擎中)