如何恢复 FlutterError.onError?

Posted

技术标签:

【中文标题】如何恢复 FlutterError.onError?【英文标题】:how to restore FlutterError.onError? 【发布时间】:2021-07-21 10:34:05 【问题描述】:

在我的应用程序中,我将颤振 onError 记录到 crashalytics,

FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;

在运行集成测试时,如果发生一些异常,我会在控制台中看到以下语句并且测试只是挂起,

运行测试时引发以下异常:I/flutter (30479): 测试覆盖了 FlutterError.onError 但未能将其返回 它的原始状态,或者有意外的附加错误,它可能 不处理。通常,这是由之前使用 expect() 引起的 恢复 FlutterError.onError。

控制台中的上述消息表明onError 覆盖有问题,我如何根据控制台中的建议将FlutterError.onError 恢复到其原始状态。

请注意,我使用integration test的新推荐方式,

【问题讨论】:

【参考方案1】:

onErrorFlutterError 的公共静态成员,因此从技术上讲,它可以被任何地方的任何人覆盖。在运行测试体之前,testWidgets() 函数本身也用自己的错误处理程序覆盖了FlutterError.onError。您可以阅读其source code 了解更多信息。

基本上,发生了以下事情:

testWidgets('', (tester) async  // onError is overridden with the handler of the test framework
  await app.main(); // onError is overridden again with crashlytics error handler
  //...
  expect(); // Flutter yells that you should have not touched its onError
);

关键是 Flutter 测试框架需要它的onError 才能正常工作。所以无论你做什么,记得调用测试框架的错误处理程序。

以下是我在项目中用来“恢复”FlutterError.onError(并执行其他操作)的方式:

testWidgets('', (tester) async 
  final originalOnError = FlutterError.onError!;
  FlutterError.onError = (FlutterErrorDetails details) 
    // do something like ignoring an exception
    originalOnError(details); // call test framework's error handler
  ;
  // ...
  expect();
);

经过一些修改,我认为你的问题是可以解决的。

【讨论】:

【参考方案2】:

嗯,好的.. 似乎我们有几个与此相关的问题?:link-1、link-2、link-3

长话短说:integration_test lib 目前似乎只针对“快乐路径”进行了优化。

在我的情况下,启用此行时,Firebase 与 integration_test 发生冲突:

   FirebaseMessaging.onBackgroundMessage(_onBackgroundOrTerminatedHandler);

一旦我禁用它(运行集成测试时),错误就消失了。

【讨论】:

【参考方案3】:

尝试更新到flutter 2.5.0。这似乎已经解决了。

运行测试时不再卡住。所以它继续执行其余的测试。虽然它仍然显示_pendingExceptionDetails != null 错误

【讨论】:

以上是关于如何恢复 FlutterError.onError?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的Error的捕获及处理

如何恢复hadoop中被删除的文件

oracle 如何恢复误删的表记录数据

如何恢复Fedora系统

CSS 如何恢复到默认样式?

如何恢复删除掉的CVS文件