如何在 Flutter 小部件测试中停用或忽略布局溢出消息?

Mar*_*rcG 4 testing layout flutter flutter-test

测试使用Ahem 字体运行,该字体太大,有时会溢出,破坏测试。一些测试无论如何都不关心溢出,所以应该有一种方法来停用它们。

我有许多测试在模拟器中运行正常,但在测试中出现故障。

对于现实中永远不会溢出的小部件,我们被迫防止溢出,或者为测试提供字体,而不是Ahem,只是为了不溢出测试。除非您正在进行“溢出错误测试”,否则测试溢出错误是没有意义的。

如何关闭这些错误,或者如何让测试忽略它们?

Edu*_*chi 11

根据@R\xc3\xa9miRousselet 的回答,我开发了一个解决方案。

\n\n
FlutterError.onError = _onError_ignoreOverflowErrors;\n\nFunction _onError_ignoreOverflowErrors = (\n  FlutterErrorDetails details, {\n  bool forceReport = false,\n}) {\n  assert(details != null);\n  assert(details.exception != null);\n  // ---\n\n  bool ifIsOverflowError = false;\n\n  // Detect overflow error.\n  var exception = details.exception;\n  if (exception is FlutterError)\n    ifIsOverflowError = !exception.diagnostics\n        .any((e) => e.value.toString().startsWith("A RenderFlex overflowed by"));\n\n  // Ignore if is overflow error.\n  if (ifIsOverflowError)\n    print(\'Overflow error.\');\n\n  // Throw others errors.\n  else\n    FlutterError.dumpErrorToConsole(details, forceReport: forceReport);\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

该函数仅忽略溢出异常。

\n


Rém*_*let 9

您无法专门禁用溢出。但还有一些替代方案:


小智 6

如果您的问题纯粹是由于Ahem 字体太大而引起的,您可以尝试使用可访问性 textScaleFactor 缩小所有文本,方法是将 WidgetUnderTest 包装在 MediaQuery 中,如下所示:

MediaQuery(
  // Shrink the text avoid overflow caused by large Ahem font.
  data: MediaQueryData(textScaleFactor: 0.5),
  child: WidgetUnderTest(),
);
Run Code Online (Sandbox Code Playgroud)

这应该比在您的小部件测试中加载不同的字体快得多,并且不会因混淆FlutterError.onError. 但是,如果您的小部件不支持 textScaleFactor,或者如果溢出是由其他原因引起的,这将无济于事。

请注意,这可能隐藏了一个实际问题。最好的解决方案是修复或重新设计您的 UI,使其即使使用大字体的 testScaleFactor: 1.5 也不会溢出,因此将字体设置为最大设置的用户将能够使用您的应用程序。