Không có ứng dụng Firebase nào '[DEFAULT]' được tạo - hãy gọi Firebase.initializeApp () trong Flutter và Firebase


143

Tôi đang xây dựng một Ứng dụng rung và tôi đã tích hợp Firebase nhưng tôi vẫn gặp lỗi này khi tôi nhấp vào nút để đăng ký, đăng nhập hoặc đăng xuất. Tôi đã thấy những người khác đã hỏi cùng một câu hỏi nhưng dường như không có câu hỏi nào phù hợp với tôi. Tôi đang sử dụng Flagship và Android studio. Có thể giúp gì không?

Đây là đoạn trích mã của tôi

    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"),
          )
        )
      )
    );
  }
}

Dưới đây là ngoại lệ được ném ra

══╡ 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()

Câu trả lời:


333

Bắt đầu từ ngày 17 tháng 8 năm 2020

Tất cả các phiên bản Firebase đã được cập nhật và bây giờ bạn phải gọi Firebase.initializeApp()trước khi sử dụng bất kỳ sản phẩm Firebase nào, ví dụ:

Trước tiên, tất cả các sản phẩm Firebase hiện đều phụ thuộc vào firebase_corephiên bản (0.5.0+), do đó bạn cần thêm nó vào pubspec.yamltệp:

dependencies:
  flutter:
    sdk: flutter
  firebase_core : ^0.5.0
  # cloud_firestore: ^0.14.0 other firebase dependencies

Sau đó, bạn phải gọi Firebase.initializeApp():

Ví dụ đầu tiên

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();
      },
    );
  }
}

Ví dụ thứ hai với 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();
  }
}

Ví dụ thứ ba:

Khởi tạo nó trong initState()cuộc gọi sau setState()đó sẽ gọi build()phương thức.

  @override
  void initState() {
    super.initState();
    Firebase.initializeApp().whenComplete(() { 
      print("completed");
      setState(() {});
    });
  }

Ví dụ thứ tư:

Khởi tạo nó trong main()phương thức sau khi gọiWidgetsFlutterBinding.ensureInitialized();

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

Lưu ý : Bạn chỉ phải gọi initializeApp()một lần


40
ví dụ thứ 4 nên là nó. Chỉ cần nhớ thêm không đồng bộ. Tôi tự hỏi nếu sự chậm trễ là đáng chú ý.
Ryde

12
Đúng, ví dụ thứ 4 là ví dụ tốt nhất, chỉ cần cho tất cả các cách, thứ hai cũng tốt vì bạn chỉ có thể khởi tạo trước khi nhận dữ liệu đầu tiên từ cửa hàng lửa hoặc cơ sở dữ liệu thời gian thực trong cùng một FutureBuilder
Peter Haddad

4
Cảm ơn, nó hoạt động bằng cách sử dụng # 4. Nhưng nếu bạn nhấn nút "quay lại", khi bạn quay lại ứng dụng, nó sẽ thông báo điều tương tự "Chưa có ứng dụng Firebase '[DEFAULT]' nào được tạo - hãy gọi Firebase.initializeApp ()" ngay cả khi nó đang ở trong main ()
octet

4
@MichaelDiCioccio khung công tác rung đã sử dụng liên kết tiện ích để có thể tương tác với công cụ rung. Khi bạn gọi ensureInitislizednó sẽ tạo ra một phiên bản của Widgetbindingvà do Firebase.initializeApp()nhu cầu sử dụng các kênh nền tảng để gọi gốc thì bạn cần phải hủy bỏ ràng buộc. api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/… (kênh nền tảng đang ở trong động cơ rung)
Peter Haddad

2
# 4 Dường như không hoạt động với Nhà cung cấp (thông báo lỗi giống như ban đầu)
castaway

50
  1. Thêm vào pubspec.yaml

    firebase_core :
    
  2. thêm vào main.dart

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

1
Những dòng này sẽ cho: lib / main.dart: 6: 9: Lỗi: Không tìm thấy Getter: 'Firebase'. chờ Firebase.initializeApp (); ^^^^^^^^
Kaspar L. Palgi

Tôi đã quên nhắc nhở firebase_core. Đã làm điều đó. Hiện tại: Những dòng này sẽ cho biết: E / flay (24294): [LỖI: flay / lib / ui / ui_dart_state.cc (166)] Ngoại lệ chưa được xử lý: [core / no-app] Không có ứng dụng Firebase '[DEFAULT]' đã được đã tạo - gọi Firebase.initializeApp ()
Kaspar L. Palgi

Tại đây firebase.google.com/support/release-notes/android cho biết: Firebase-core của thư viện Android Firebase không còn cần thiết nữa. SDK này bao gồm SDK Firebase cho Google Analytics. Bây giờ, để sử dụng Analytics hoặc một sản phẩm khuyến nghị sử dụng Analytics (xem bảng bên dưới), bạn cần phải thêm rõ ràng phần phụ thuộc Analytics: com.google.firebase: firebase-analytics: 17.5.0 hoặc com.google.firebase: firebase -analytics-ktx: 17.5.0.
Kaspar L. Palgi

Còn nếu khởi tạoApp sẽ gặp sự cố? Ứng dụng sẽ không được khởi động. Tôi không tìm thấy bất cứ điều gì về vấn đề này có thể xảy ra.
Boris Salimov

@BorisSalimov Vì initializeApp()là cuộc gọi không đồng bộ, ứng dụng sẽ vẫn khởi động ngay cả khi nó không thành công
21rw

11

Nếu bạn muốn kết nối firebase với ứng dụng Flagship, bạn cần phải initalizt firebase trước khi sử dụng. Bạn có thể khai báo nó như được cung cấp bên dưới và nó sẽ giúp bạn giải quyết vấn đề

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

Trong video bạn sẽ biết chi tiết về lỗi


Nó chỉ cho tôi một lỗi - NoSuchMethodError sau đây đã được ném vào tòa nhà Builder: I / flashing (5612): Phương thức 'then' được gọi trên null. I / rung (5612): Người nhận: không I / rung (5612): Đã cố gắng gọi: sau đó (Đóng cửa: (động) => Không)
Abir Ahsan

Vui lòng làm theo video có trong liên kết, vấn đề của bạn sẽ được giải quyết. Nếu vẫn phải đối mặt với lỗi xin vui lòng cho tôi biết.
Raju Gupta

7

Đây là một giải pháp đơn giản cho việc này:

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

4

Câu trả lời của @ peter là Hoàn hảo !! nhưng Nếu bạn vẫn gặp lỗi trong mã của mình và sau khi làm theo codelbase firebase, hãy lưu ý rằng các hướng dẫn đó đã lỗi thời kể từ tháng 8 năm 2020 và chưa được cập nhật. bạn cần thực hiện nhiều thay đổi khác như:

  • thay thế .databằng.data()
  • thay thế updateDatabằngupdate

Hy vọng điều này có thể giúp một số người mới như tôi.


3

Nếu bạn vẫn gặp sự cố khi rời ứng dụng ra màn hình chính, bạn có thể thêm .darttệp này vào bất kỳ tệp nào bằng cách sử dụng firebase:

class App extends StatelessWidget {
  
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  @override
  Widget build(BuildContext context) {

Hoặc trong trường hợp 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();
  }
}

Để biết thêm thông tin, hãy kiểm tra liên kết này .


Tôi gặp lỗi ngay cả khi tôi thực hiện quy trình tương tự như tài liệu. đây là lỗi No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() . Tôi đã khởi chạy Firebase trong tiện ích con trạng thái.
Vikrant Agrahari

3

Nếu bạn đã làm theo câu trả lời của Peter và vẫn gặp lỗi tương tự, hãy kiểm tra để đảm bảo rằng bất kỳ thứ gì khác bạn có trong mainhàm của mình đều xuất hiện sau await Firebase.initializeApp()cuộc gọi, như sau:

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

Cảm ơn. Câu trả lời của @ Peter đã giúp đỡ
Kobby Giảm giá

2

Đầu tiên hãy thêm phụ thuộc này:

firebase_core :

Thứ 2: trong hàm main của dự án thêm 2 dòng này và làm cho hàm không đồng bộ

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

bây giờ bạn có thể sử dụng firebase bình thường trong bất kỳ tệp hoặc tiện ích con nào trong dự án.

Tiện ích con FutureBuilder cũng sẽ hoạt động nhưng bạn phải thêm nó mỗi khi bạn muốn truy cập firebase.


1

Bạn cần thêm await Firebase.initializeApp();cái nào là a Future. Thực hiện bên trong tệp phi tiêu đang chạy chức năng Firebase của bạn như bên dưới:

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

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MaterialApp());
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.