Flutter Add to App集成firebase_crashlytics报[DEFAULT]应用不存在错误
Flutter Add to App场景Firebase Crashlytics初始化报错解决方案
问题概要
在Flutter Add to App混合开发模式下,通过FlutterFire配置Firebase Crashlytics时,已尝试社区公开的同类问题解决方案,均未生效。
场景说明
- 父级宿主应用未集成任何Firebase插件,也未调用
Firebase.initialize()方法,仅以依赖包形式引入子Flutter模块 - 子Flutter应用内部独立集成Firebase相关插件并编写初始化逻辑
- 子应用
main.dart原有初始化逻辑如下:
void main() { runZonedGuarded(() async { // 必须优先初始化Flutter绑定 WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 后续业务逻辑 }); }
问题表现
Firebase 1.5.0版本下功能运行正常,为接入Crashlytics升级Firebase相关依赖后,运行时抛出如下未捕获异常:
[VERBOSE-2:ui_dart_state.cc(198)] Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() #0 MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:193:5) #1 Firebase.app (package:firebase_core/src/firebase.dart:53:41) #2 FirebaseCrashlytics.instance (package:firebase_crashlytics/src/firebase_crashlytics.dart:33:55) #3 main.<anonymous closure> (package:package/main.dart:58:25) #4 _rootRunBinary (dart:async/zone.dart:1450:47) #5 _CustomZone.runBinary (dart:async/zone.dart:1342:19) #6 runZonedGuarded.<anonymous closure> (dart:async/zone.dart:1832:18) #7 _Zone._processUncaughtError (dart:async/zone.dart:1109:14) #8 _CustomZone.handleUncaughtError (dart:async/zone.dart:1312:5) #9 Future._propagateToListeners (dart:async/future_impl.dart:680:16) #10 Future._completeError (dart:async/future_impl.dart:574:5) #11 _completeOnAsync<…>
调用栈显示异常触发于获取FirebaseCrashlytics.instance实例的环节。
已尝试方案
- 执行
flutter configure命令生成firebase_options.dart配置文件,初始化Firebase时传入当前平台对应配置,代码如下:
await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, );
- Firebase初始化时传入自定义name参数
两种方案均未解决报错。
根因说明
[DEFAULT] Firebase应用的注册逻辑位于firebase_core插件的原生MethodChannel侧,Dart层调用Firebase.initializeApp()是异步操作,高版本FlutterFire中FirebaseCrashlytics.instance为静态惰性实例,初始化时会直接读取原生端已注册的[DEFAULT]应用,一旦读取操作早于原生端实例注册完成的时机,就会抛出no-app异常。另外Crashlytics默认仅绑定名称为[DEFAULT]的Firebase实例,传入自定义name参数会直接导致实例匹配失败。
修复步骤
- 移除初始化时传入的自定义name参数,保留
DefaultFirebaseOptions.currentPlatform配置项,确保初始化目标为[DEFAULT]实例 - 调整初始化时序,在
Firebase.initializeApp()执行完成后,增加一次实例可用性校验,确认原生端实例注册完成后再获取Crashlytics实例,修正后的初始化代码如下:
void main() { runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化DEFAULT实例 await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); // 等待原生端实例注册完成,校验可用性 final defaultApp = Firebase.app(); await defaultApp.setAutomaticDataCollectionEnabled(true); // 实例可用后再绑定Crashlytics错误捕获 FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; runApp(const MyApp()); }, (error, stackTrace) { FirebaseCrashlytics.instance.recordError(error, stackTrace, fatal: true); }); }
- 检查Flutter模块Android侧配置:在Flutter模块的
android/build.gradle中确认已正确引入Crashlytics插件,不要在宿主原生层初始化Firebase,避免和Flutter模块内的初始化逻辑产生实例冲突。
注意:如果使用缓存FlutterEngine的方式加载Flutter模块,需要确保Firebase初始化逻辑在FlutterEngine首次附着时执行,不要在Engine预热阶段提前调用Crashlytics相关实例。
内容的提问来源于stack exchange,提问作者satyajit
相关产品推荐
相关产品推荐

