Ken*_*usu 297 dart firebase flutter google-cloud-firestore
我正在构建一个 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"),
)
)
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
下面是抛出的异常
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"),
)
)
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*dad 641
所有 Firebase 版本都已更新,现在您必须Firebase.initializeApp()在使用任何 Firebase 产品之前调用,例如:
首先,所有 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
Run Code Online (Sandbox Code Playgroud)
然后你必须打电话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();
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
在initState()then call 中初始化它,setState()这将调用该build()方法。
@override
void initState() {
super.initState();
Firebase.initializeApp().whenComplete(() {
print("completed");
setState(() {});
});
}
Run Code Online (Sandbox Code Playgroud)
main()调用后在方法中初始化WidgetsFlutterBinding.ensureInitialized();
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
initializeApp()一次Muh*_*raf 133
添加到 pubspec.yaml
firebase_core :
Run Code Online (Sandbox Code Playgroud)
添加到 main.dart
import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
Cop*_*oad 34
安装 FlutterFire CLI
dart pub global activate flutterfire_cli
Run Code Online (Sandbox Code Playgroud)
(可选)将以下行添加到您的~/.zshrc文件中并保存
export PATH="$PATH":"$HOME/.pub-cache/bin"
Run Code Online (Sandbox Code Playgroud)
跑过configure:
flutterfire configure
Run Code Online (Sandbox Code Playgroud)
按此键enter配置所有平台
您现在应该有一个lib/firebase_options.dart文件。将此文件导入到您的main.dart并使用Firebase.initializeApp.
dart pub global activate flutterfire_cli
Run Code Online (Sandbox Code Playgroud)
如果您已经有现有的应用程序,可以通过以下方式进行迁移。
在 Xcode 中打开<flutter-project>/ios/Runner.xcworkspace文件并GoogleService-Info.plist从 Runner 中删除该文件。
在 Xcode 中打开<flutter-project>/macos/Runner.xcworkspace文件并GoogleService-Info.plist从 Runner 中删除该文件。
ola*_*mmy 20
自 2017 年 8 月以来,所有 Firebase 服务均已更新,因此您必须在 main 中调用 Firebase.initializeApp() 才能使用任何 Firebase 产品,例如:
如果您想在 flutter 应用程序中使用 firebase_core 插件,请在 pubspec.yaml 文件中添加 firebase_core ,如下所示
dependencies:
flutter:
sdk: flutter
firebase_core: ^1.19.1
Run Code Online (Sandbox Code Playgroud)
然后在您的应用程序中调用 Firebase.initializeApp(): 。与下面的内容相同:
import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
Sha*_*tim 11
从 Flutter 版本 2.8 开始,现在可以使用 Firebase.initializeApp 函数在所有平台上从 Dart 初始化 FlutterFire。有一种更简单、更快捷的方法来初始化 Firebase 项目,而不是从 Firebase 控制台下载 .json 和 .plist 文件并将它们放入 Flutter 项目文件夹中,这可能会导致多个警告。这是我多次遇到的问题,以下是我的解决方法。
在此处的 Firebase 控制台步骤中创建项目并在此处安装 Firebase CLI后,请继续执行以下步骤:
如果您已经使用 flutterfire configure 配置了 firebase 项目,则可以跳过步骤 1 并跳转到步骤 4。
从项目根终端,命令:
$ flutterfire configure
// This requires the Firebase CLI to work.
Run Code Online (Sandbox Code Playgroud)
按 Return 或 Enter 键选择 Firebase 项目。
插入捆绑包 ID。您可以通过右键单击 ios 文件夹 > 然后单击“在 xcode 中打开”来获取此信息。捆绑包标识符将出现在右侧白色面板中,您必须在出现提示时在终端中手动输入该标识符。
** 如果您已经安装了 firebase_core 插件,请继续执行步骤 5。**
从项目根目录运行以下命令来安装最新版本的 firebase_core 插件:
$ flutter pub add firebase_core // Adds to pubspec.yaml
Run Code Online (Sandbox Code Playgroud)
将导入添加到主文件:
import 'package:firebase_core/firebase_core.dart'; //
import 'firebase_options.dart'; // Generated file
Run Code Online (Sandbox Code Playgroud)
更新您的 main 函数以使用此异步函数初始化 firebase:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options:
DefaultFirebaseOptions.currentPlatform);
runApp(const YourAppName());
}
Run Code Online (Sandbox Code Playgroud)
Jen*_*ens 10
使用 Firebase 进行 Flutter Web
如果您将 Flutter Web 与 Firebase 一起使用,请确保您已将 SDK 安装在body您的代码中./web/index.html
<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>
Run Code Online (Sandbox Code Playgroud)
此外,请确保您firebase.initializeApp(...)还使用配置参数进行调用index.html。
<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>
Run Code Online (Sandbox Code Playgroud)
最后按照Peter Haddad 的回答中所述配置 firebase :
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
如果您遵循了Peter 的回答并且仍然遇到相同的错误,请检查以确保您的main函数中的其他任何内容都在await Firebase.initializeApp()调用之后出现,如下所示:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
小智 7
如果当您将应用程序保留到主屏幕时仍然遇到问题,您可以.dart使用 Firebase 将其添加到任何文件中:
class App extends StatelessWidget {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
Run Code Online (Sandbox Code Playgroud)
或者在 a 的情况下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();
}
}
Run Code Online (Sandbox Code Playgroud)
欲了解更多信息,请查看此链接。
小智 7
彼得的回答是完美的!!但是,如果您的代码仍然出现错误并遵循Flutter Firebase代码实验室,请注意,这些教程截至 2020 年 8 月已过时且尚未更新。
您需要进行许多其他更改,例如:
.data为.data()updateData为update首先,添加此依赖项:
firebase_core :
Run Code Online (Sandbox Code Playgroud)
第二:在项目的main函数中,添加这两行,使函数async:
void main() async {
// These two lines
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
//
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
现在您可以在项目中的任何文件或小部件中正常使用 Firebase。
该FutureBuilder部件将工作,要么,但你必须每次你想添加它来访问火力地堡。
您需要添加await Firebase.initializeApp();which 是Future. 在运行 Firebase 函数的 dart 文件中执行此操作,如下所示:
import 'package:firebase_core/firebase_core.dart';
...
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MaterialApp());
}
Run Code Online (Sandbox Code Playgroud)
这是2022年初始化firebase的方式
首先,通过此链接安装 FlutterFire ==> Flutter Fire 安装链接
安装 FlutterFire 后,您需要在 lib/main.dart 文件中添加这些代码行
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
Run Code Online (Sandbox Code Playgroud)
然后编辑您的主要功能,如下所示
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options:
DefaultFirebaseOptions.currentPlatform,);
runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
这将来可能会发生变化,因此请参阅此链接以获取下面的最新实施参考
| 归档时间: |
|
| 查看次数: |
154194 次 |
| 最近记录: |