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

问题描述 投票:0回答:1

假设在 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 与 Object+StackTrace)有什么意义……真正的区别是什么?

flutter dart error-handling dart-async flutter-platform-channel
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

© www.soinside.com 2019 - 2024. All rights reserved.