ไม่มีการสร้างแอป Firebase "[DEFAULT]" - โทร Firebase.initializeApp () ใน Flutter และ Firebase
ฉันกำลังสร้างแอพพลิเคชั่น 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()
คำตอบ
เริ่มตั้งแต่วันที่ 17 สิงหาคม 2020
เวอร์ชัน 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
จากนั้นคุณต้องโทร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()
จากนั้นเรียกsetState()
ซึ่งจะเรียกใช้build()
เมธอด
@override
void initState() {
super.initState();
Firebase.initializeApp().whenComplete(() {
print("completed");
setState(() {});
});
}
ตัวอย่างที่สี่:
เริ่มต้นในmain()
วิธีการหลังจากโทรWidgetsFlutterBinding.ensureInitialized();
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(); await Firebase.initializeApp(); runApp(MyApp()); }
หากคุณต้องการเชื่อมต่อ firebase กับแอพพลิเคชั่น flutter คุณต้องเริ่มต้น firebase ก่อนใช้งาน คุณสามารถประกาศได้ตามที่ระบุด้านล่างและจะช่วยคุณในการแก้ไขปัญหา
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
นี่คือวิธีง่ายๆสำหรับสิ่งนี้:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp(),);
}
คำตอบของ @ peter คือ Perfect !! แต่หากคุณยังคงพบข้อผิดพลาดในโค้ดของคุณและทำตามโค้ดแล็บไฟเบสที่กระพือปีกโปรดทราบว่าบทช่วยสอนเหล่านั้นล้าสมัยในเดือนสิงหาคม 2020 และยังไม่ได้อัปเดต คุณต้องทำการเปลี่ยนแปลงอื่น ๆ อีกมากมายเช่น:
- แทนที่
.data
ด้วย.data()
- แทนที่
updateData
ด้วยupdate
หวังว่านี่อาจช่วยมือใหม่อย่างผมได้บ้าง
หากคุณยังคงมีปัญหาเมื่อออกจากแอปไปที่หน้าจอหลักคุณสามารถเพิ่มสิ่งนี้ลงใน.dart
ไฟล์ใดก็ได้โดยใช้ firebase:
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();
}
}
สำหรับข้อมูลเพิ่มเติมโปรดตรวจสอบลิงค์นี้
หากคุณทำตามคำตอบของ Peter และยังคงได้รับข้อผิดพลาดเดิมให้ตรวจสอบให้แน่ใจว่ามีสิ่งอื่นใดในmain
ฟังก์ชันของคุณเกิดขึ้นหลังจากการawait Firebase.initializeApp()
โทรเช่น:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
runApp(MyApp());
}
อันดับแรกเพิ่มการอ้างอิงนี้:
firebase_core :
2nd: ในฟังก์ชั่นหลักของโปรเจ็กต์ให้เพิ่ม 2 บรรทัดเหล่านี้และทำให้ฟังก์ชัน async
void main() async {
// these 2 lines
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
//
runApp(MyApp());
}
ตอนนี้คุณสามารถใช้ firebase ได้ตามปกติในไฟล์หรือวิดเจ็ตใด ๆ ในโปรเจ็กต์
วิดเจ็ต FutureBuilder ก็ใช้งานได้เช่นกัน แต่คุณต้องเพิ่มทุกครั้งที่คุณต้องการเข้าถึง firebase
คุณต้องเพิ่มawait Firebase.initializeApp();
ซึ่งเป็นไฟล์Future
. ภายในไฟล์ dart ที่เรียกใช้ฟังก์ชัน Firebase ของคุณดังต่อไปนี้:
import 'package:firebase_core/firebase_core.dart';
...
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MaterialApp());
}