假设在 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)有什么意义……真正的区别是什么?
事实上,您引用的文档页面中提供了答案。
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
。