【问题标题】:Difference between FlutterError.onError and PlatformDispatcher.instance.onError in FlutterFlutter中FlutterError.onError和PlatformDispatcher.instance.onError的区别
【发布时间】:2023-02-04 14:35:46
【问题描述】:

假设在 Flutter 应用程序中,我们希望在顶层捕获任何未捕获的异常/错误,因此我们按照 the docs 执行此操作:

main() {
  
  // All uncaught errors thrown from synchronous code blocks will end up here:
  FlutterError.onError = (FlutterErrorDetails details) {
    MyLogger.instance.logUncaughtErrorSync(details);
  };

  // All uncaught errors thrown from async code blocks will end up here:
  PlatformDispatcher.instance.onError = (Object error, StackTrace stack) {
    MyLogger.instance.logUncaughtErrorASync(error, stack);
    return true;
  };
  
  runApp(const MyApp());

我能说出两者之间的唯一区别是对象(错误)是从异步代码还是同步代码中抛出的。

不过,肯定不止于此,那么拥有两个独立机制(具有不同的输入——Flutter ErrorDetails 与 Object+StackTrace)有什么意义……真正的区别是什么?

【问题讨论】:

    标签: flutter dart error-handling


    【解决方案1】:

    事实上,答案在您引用的文档页面中提供。

    FlutterError.onError 用于 Flutter 框架错误——发生在框架级别的错误(在构建、布局和绘制阶段遇到的错误)。简而言之,如果您因编写的 Dart 代码或 Flutter 框架中的代码而发生错误,请转到FlutterError.onError

    另一方面,PlatformDispatcher.instance.onError 用于平台级错误。如您所知,Flutter 支持多种平台,并且这些平台在其本机层执行代码。例如,您使用插件或使用 Platform 通道实现您自己的 Flutter 插件代码:

    OutlinedButton(
      child: const Text('Click me!'),
      onPressed: () async {
        const channel = MethodChannel('crashy-custom-channel')
        await channel.invokeMethod('blah')
      },
    )
    

    在这种情况下,这不再是 Flutter 级别的错误,因此它将被转发到PlatformDispatcher.instance.onError

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 2019-11-15
      • 1970-01-01
      • 2020-05-06
      • 2023-01-26
      • 1970-01-01
      • 2021-09-06
      • 2019-01-22
      • 1970-01-01
      相关资源
      最近更新 更多