Flutter - 未处理的异常:[core/duplicate-app]

6

我正在使用Firebase构建一个Flutter应用程序。我使用的Firebase服务是实时数据库和身份验证。该应用程序通常情况下可以正常启动而不会抛出任何异常,但是在热重启应用程序时,应用程序会冻结并抛出以下异常:

Unhandled Exception: [core/duplicate-app] A Firebase App named "db2" already exists

我认为初始化 FirebaseApp 的过程出了问题。在 main.dart 中的初始化代码如下:

WidgetsFlutterBinding.ensureInitialized();
  final FirebaseApp app = await Firebase.initializeApp(
    name: 'db2',

有人可以帮我解决这个问题吗?谢谢!


请告诉我您在应用程序中放置此代码的位置? - Balasubramani Sundaram
它在 main.dart 文件的 main() 方法内部。 - Amit Kumar Yadav
3个回答

14
我在Firebase中有两个应用程序。一个是安卓应用,另一个是Web应用。因此,要像这样初始化Firebase实例:

我在Firebase中有两个应用程序。一个是安卓应用,另一个是Web应用。因此,要像这样初始化Firebase实例:

const firebaseConfig = FirebaseOptions(
apiKey: "AIzaSyA1S7r-kyTOCLWttcf4kC3Qye0s-gl96Ec",
appId: "1:390108250565:web:9821516ca39ba976358bac",
messagingSenderId: "390108250565",
projectId: "doc-appointment-aa751",
);


if(kIsWeb){

 await Firebase.initializeApp(
   options: firebaseConfig,
 );
}else{
   await Firebase.initializeApp();
} 

1
谢谢,这解决了我的问题。不过可能需要将以下代码添加到顶部: import 'package:flutter/foundation.dart' show kIsWeb; - David Larsen

7

这种情况是因为你初始化的FirebaseApp会在应用重启时保留。并且,如果你正在初始化一个非默认应用程序,你必须为Firebase应用实例命名以便访问它们。

要解决这个问题,你需要捕获在此步骤抛出的错误。可以像这样做:

try {

// you can also assign this app to a FirebaseApp variable
// for example app = await FirebaseApp.initializeApp...

    await Firebase.initializeApp(
      name: 'SecondaryApp',
      options: FirebaseOptions(
        appId: '<appID>',
        apiKey: '<APIKey>',
        messagingSenderId: '<msgSID>',
        projectId: '<projectID>',
        databaseURL: '<dbUrl>/',
      ),
    );
  } on FirebaseException catch (e) {
    if (e.code == 'duplicate-app') {
// you can choose not to do anything here or either 
// In a case where you are assigning the initializer instance to a FirebaseApp variable, // do something like this:
// 
//   app = Firebase.app('SecondaryApp');
//
    } else {
      throw e;
    }
  } catch (e) {
    rethrow;
  }


为了解释这一点,我们捕获了与现有FirebaseApp相同名称的抛出错误。 这解决了我的问题,希望能帮到你。

2
我通过为initializeApp方法添加一个名称来解决了这个问题:
void main() async {
  await Firebase.initializeApp(
      name: "YourAppName",
      options: FirebaseOptions(
          apiKey: '<apiKey>',
          appId: '<appId>',
          messagingSenderId: '<senderId>',
          projectId: '<projectId>'));

  runApp(MyApp());
}

注意:在整个项目中只需使用Firebase.initializeApp一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接