FlutterError.onError 和 PlatformDispatcher.instance.onError 在Flutter中的区别。

5

假设在Flutter应用程序中,我们想要在顶层捕获任何未经处理的异常/错误,那么根据文档,我们可以这样做:

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());

文档似乎暗示了两者之间的区别是错误源自Dart(特别是“Flutter”)代码还是平台(Android / IOS)代码,但通过我的测试,我只能看出两者之间的区别是对象(错误)是否来自异步和同步的Dart代码。

例如,如果在Dart代码中(而不是平台代码),我们只需输入:

_function() async {
    throw('error');
}

当我们调用该函数时,它将通过“平台调度程序”冒泡并被视为“平台错误”,但似乎只是因为它发生在后台线程?

实际上似乎没有机制允许从Java或Swift代码抛出的异常触发这两个onError函数。

然而,这其中必须有更多内容,那么为什么要有两种不同的机制(具有不同的输入 - FlutterErrorDetails vs Object + StackTrace)...真正的区别是什么?

1个回答

2
事实上,你所引用的文档页面已经提供了答案。 FlutterError.onError 用于处理 Flutter 框架错误——即在构建、布局和绘制阶段遇到的错误。简单来说,如果由于你编写的 Dart 代码或 Flutter 框架中的代码而导致错误,则该错误会传递给 FlutterError.onError
另一方面,PlatformDispatcher.instance.onError 用于处理平台级别的错误。正如你所知,Flutter 支持多个平台,并且这些平台在其本地层执行代码。例如,你可以使用插件或使用平台通道实现自己的 Flutter 插件代码:
OutlinedButton(
  child: const Text('Click me!'),
  onPressed: () async {
    const channel = MethodChannel('crashy-custom-channel')
    await channel.invokeMethod('blah')
  },
)

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

1
是的,这也是我的最初理解,因为他们使用的命名和给出的示例,但是在测试后发现它与错误的性质毫无关系,只涉及错误是否发生在同步Dart代码与异步Dart代码之间。例如,在那个按钮中,你可以写成onPressed:() async {throw“poo”;},但错误仍然会被认为是“平台错误”。 - Nerdy Bunz

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