Flutter中FirebaseCrashlytics崩溃后catch未触发,如何崩溃前存数据?
问题解答
首先明确:你没法用try/catch捕获FirebaseCrashlytics.instance.crash()触发的崩溃,因为这个方法是主动触发致命崩溃,会直接终止应用进程,根本不会让异常进入catch代码块,这就是你代码里catch没执行的原因。
要实现「崩溃发生时保存标记到SharedPreferences,后续停用功能」的需求,正确的做法是通过全局未捕获异常处理器来拦截崩溃事件,在崩溃上报前先完成数据保存:
具体实现步骤(Flutter环境)
- 在应用启动时初始化SharedPreferences和Firebase
- 用
runZonedGuarded包裹应用入口,它能捕获所有未捕获的异常 - 在异常回调里先保存标记到SharedPreferences,再把异常上报给Crashlytics
示例代码:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 提前初始化SharedPreferences final prefs = await SharedPreferences.getInstance(); runZonedGuarded(() { runApp(const MyApp()); }, (error, stackTrace) { // 崩溃发生时立即保存标记 prefs.setBool("crash", true); // 将异常上报到Crashlytics FirebaseCrashlytics.instance.recordError(error, stackTrace, fatal: true); }); }
额外说明
- 如果你只是想测试异常捕获逻辑,不要用
FirebaseCrashlytics.instance.crash(),直接用throw Exception("测试崩溃")就能被try/catch或runZonedGuarded捕获 - 后续启动应用时,读取SharedPreferences里的"crash"标记,即可判断是否需要停用对应功能
内容的提问来源于stack exchange,提问作者Nitneuq
相关产品推荐
相关产品推荐

