ไม่มีการสร้างแอป Firebase "[DEFAULT]" - โทร Firebase.initializeApp () ใน Flutter และ Firebase


184

ฉันกำลังสร้างแอปพลิเคชัน 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()

คำตอบ:


416

เริ่มตั้งแต่วันที่ 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()เพียงครั้งเดียว


47
ตัวอย่างที่ 4 ควรจะเป็น อย่าลืมเพิ่ม async ฉันสงสัยว่าความล่าช้านั้นเห็นได้ชัด
Ryde

15
ใช่ตัวอย่างที่ 4 เป็นตัวอย่างที่ดีที่สุดเพียงแค่คิดว่าจะแสดงทุกวิธีอย่างที่สองก็ดีเช่นกันเพราะคุณสามารถเริ่มต้นก่อนที่จะรับข้อมูลแรกจาก firestore หรือฐานข้อมูลเรียลไทม์ใน FutureBuilder เดียวกัน
Peter Haddad

5
ขอบคุณมันใช้งานได้โดยใช้ # 4 แต่ถ้าคุณกดปุ่ม "ย้อนกลับ" เมื่อคุณกลับไปที่แอปมันจะบอกว่า "ไม่มีแอป Firebase" [ค่าเริ่มต้น] "ถูกสร้างขึ้น - เรียก Firebase.initializeApp ()" แม้ว่าจะอยู่ใน main ()
Octet

4
@MichaelDiCioccio กรอบการกระพือปีกใช้การผูกวิดเจ็ตเพื่อให้สามารถโต้ตอบกับกลไกการกระพือปีก เมื่อคุณเรียกensureInitislizedมันว่าสร้างอินสแตนซ์ของWidgetbindingและเนื่องจากFirebase.initializeApp()จำเป็นต้องใช้แชแนลแพลตฟอร์มเพื่อเรียกเนทีฟคุณจึงต้องแทรกการเชื่อม api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/… (ช่องแพลตฟอร์มอยู่ในกลไกการกระพือปีก)
Peter Haddad

2
# 4 ดูเหมือนจะไม่ทำงานกับผู้ให้บริการ (ข้อความแสดงข้อผิดพลาดเดียวกันกับตอนแรก)
castaway

74
  1. เพิ่มใน pubspec.yaml

    firebase_core :
    
  2. เพิ่มใน main.dart

    import 'package:firebase_core/firebase_core.dart';
    
    void main() async {
       WidgetsFlutterBinding.ensureInitialized();
       await Firebase.initializeApp();
       runApp(MyApp());
    }
    

1
บรรทัดเหล่านี้จะให้: lib / main.dart: 6: 9: Error: Getter not found: 'Firebase' รอ Firebase.initializeApp (); ^^^^^^^^
Kaspar L. Palgi

ฉันลืมที่จะอธิบาย firebase_core ทำอย่างนั้น ตอนนี้: บรรทัดเหล่านี้จะให้: E / flutter (24294): [ERROR: flutter / lib / ui / ui_dart_state.cc (166)] Unhandled Exception: [core / no-app] No Firebase App '[DEFAULT]' สร้าง - เรียก Firebase.initializeApp ()
Kaspar L. Palgi

มันบอกที่นี่firebase.google.com/support/release-notes/androidว่า: Firebase-core ไลบรารี Android ของ Firebase ไม่จำเป็นอีกต่อไป SDK นี้รวม Firebase SDK สำหรับ Google Analytics ตอนนี้หากต้องการใช้ Analytics หรือผลิตภัณฑ์ที่แนะนำให้ใช้ Analytics (ดูตารางด้านล่าง) คุณต้องเพิ่มการพึ่งพาของ Analytics อย่างชัดเจน: com.google.firebase: firebase-analytics: 17.5.0 หรือ com.google.firebase: firebase -analytics-ktx: 17.5.0.
Kaspar L. Palgi

แล้ว initializeApp จะขัดข้องล่ะ? แอปพลิเคชันจะไม่เริ่มทำงาน ฉันไม่พบอะไรเกี่ยวกับปัญหานี้
Boris Salimov

@BorisSalimov เนื่องจากinitializeApp()เป็นการโทรแบบ async แอปพลิเคชันจะยังคงเริ่มทำงานแม้ว่าจะล้มเหลว
ก็ตาม

12

หากคุณต้องการเชื่อมต่อ firebase กับแอพพลิเคชั่น flutter คุณต้องเริ่มต้น firebase ก่อนใช้งาน คุณสามารถประกาศได้ตามที่ระบุด้านล่างและจะช่วยคุณในการแก้ไขปัญหา

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}

ในวิดีโอคุณจะได้รับรายละเอียดเกี่ยวกับข้อผิดพลาด


แสดงข้อผิดพลาด - NoSuchMethodError ต่อไปนี้ถูกโยนสิ่งก่อสร้าง Builder: I / flutter (5612): เมธอด 'then' ถูกเรียกด้วย null I / flutter (5612): ตัวรับ: null I / flutter (5612): พยายามโทร: แล้ว (ปิด: (ไดนามิก) => Null)
Abir Ahsan

โปรดติดตามวิดีโอที่อยู่ในลิงก์ปัญหาของคุณจะได้รับการแก้ไข หากยังคงพบข้อผิดพลาดโปรดแจ้งให้เราทราบ
Raju Gupta


6

คำตอบของ @ peter คือ Perfect !! แต่หากคุณยังคงพบข้อผิดพลาดในโค้ดของคุณและทำตามโค้ดแล็บไฟเบสที่กระพือปีกโปรดทราบว่าบทช่วยสอนเหล่านั้นล้าสมัยในเดือนสิงหาคม 2020 และยังไม่ได้อัปเดต คุณต้องทำการเปลี่ยนแปลงอื่น ๆ อีกมากมายเช่น:

  • แทนที่.dataด้วย.data()
  • แทนที่updateDataด้วยupdate

หวังว่านี่อาจช่วยมือใหม่อย่างผมได้บ้าง


6

หากคุณทำตามคำตอบของ Peter และยังคงได้รับข้อผิดพลาดเดิมให้ตรวจสอบให้แน่ใจว่ามีสิ่งอื่นใดในmainฟังก์ชันของคุณเกิดขึ้นหลังจากการawait Firebase.initializeApp()โทรเช่น:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
  runApp(MyApp());
}

ขอบคุณ. คำตอบของ @ Peter ช่วยได้
Kobby Discount

4

หากคุณยังคงมีปัญหาเมื่อออกจากแอปไปที่หน้าจอหลักคุณสามารถเพิ่มสิ่งนี้ลงใน.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();
  }
}

สำหรับข้อมูลเพิ่มเติมโปรดตรวจสอบลิงค์นี้


1
ฉันได้รับข้อผิดพลาดแม้ว่าฉันจะทำตามขั้นตอนเดียวกับเอกสาร No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() นี่คือข้อผิดพลาด ฉันเริ่มต้น Firebase ในวิดเจ็ตที่มีสถานะเรียบร้อยแล้ว
Vikrant Agrahari

3

อันดับแรกเพิ่มการอ้างอิงนี้:

firebase_core :

2nd: ในฟังก์ชั่นหลักของโปรเจ็กต์เพิ่ม 2 บรรทัดนี้และทำให้ฟังก์ชัน async

 void main() async {
  // these 2 lines
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  //
  runApp(MyApp());
}

ตอนนี้คุณสามารถใช้ firebase ได้ตามปกติในไฟล์หรือวิดเจ็ตใด ๆ ในโปรเจ็กต์

วิดเจ็ต FutureBuilder ก็ใช้งานได้เช่นกัน แต่คุณต้องเพิ่มทุกครั้งที่คุณต้องการเข้าถึง firebase


2

คุณต้องเพิ่มawait Firebase.initializeApp();ซึ่งเป็นไฟล์Future. ภายในไฟล์ dart ที่กำลังเรียกใช้ฟังก์ชัน Firebase ของคุณดังต่อไปนี้:

import 'package:firebase_core/firebase_core.dart';
...

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MaterialApp());
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.