Flutter中报告错误的最佳实践

7
我正在尝试在我的Flutter项目中使用firebase_crashlytics库,问题是Flutter从不崩溃,我可以在代码中抛出异常,但所有的dart异常都被视为非致命异常。这些异常将正常报告到控制台,但我希望Flutter、本机和未处理的异常被视为致命异常。
我想要以下之一:
  • 当发生意外异常时使应用程序崩溃(用“未响应”关闭应用程序)
  • 将致命异常报告给Firebase控制台
  • 一个解决方法?
我的main.dart代码:
Future main() async {
  runZoned<Future<void>>(() async {
    await DotEnv().load('.env');
    setupNotifications();
    FlutterError.onError = Crashlytics.instance.recordFlutterError;
    runApp(MyApp());
  }, onError: Crashlytics.instance.recordError);
}

我已经尝试过的方法:

  • SystemChannels.platform.invokeMethod('SystemNavigator.pop'); 它可以工作,但不是很用户友好
  • 通过 MethodChannel 调用 Kotlin 函数试图崩溃应用程序,但没有成功。

我可能可以做的事情:

  • 调用一个 toast 来通知用户出现了问题
  • 显示弹出窗口通知用户出现了问题并关闭应用程序
  • 只需关闭应用程序
  • 尝试加载应用程序主屏幕的初始状态

鉴于默认行为受到所有人的青睐,因此值得解释为什么您要尝试实现这样的行为。非致命异常即使未经处理,应用程序也可能能够从中恢复,而致命异常是应用程序无法恢复的,因此用户体验更差。您也不能强制 Firebase 将它们报告为致命异常,因为它们不是。您确实可以在“我可能会做的事情”下列出所有这些事情,但它们不在本问题的范围内。 “最佳”实践是默认设置。 - Ovidiu
1
即使是非致命异常,也可能导致应用程序出现问题,例如界面无法正确加载、按钮无法正常工作等。虽然在Flutter中这些问题被认为是“非致命”的,但它们肯定会让用户感受到变化,那么通知用户出现了问题的最佳方式是什么?为什么我们不能将已知并处理过的异常与更严重、未知的未处理异常分开呢? - Huskell
1个回答

0
你看到的行为是Flutter上Crashlytics的默认行为,至少目前是这样。如果您想退出应用程序,我可以向您推荐以下选项:
  1. 导航到一个错误屏幕,使用 Navigator.pushAndRemoveUntil() 显示通用错误消息,然后当用户点击“OK”或经过计时器后,退出应用程序。为了退出应用程序,您可以在本地端抛出异常或使用 SystemChannels.platform.invokeMethod('SystemNavigator.pop');,尽管您的应用程序可能被阻止在应用商店,因为苹果拒绝程序化退出。

  2. 小心准备一个错误屏幕,包含友好的错误消息,以便针对每种可能的错误进行处理,这样用户就不必退出应用程序。


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