有没有一种简单的方法可以在 Flutter 测试中找到从 RichText 构建的特定文本?
Is there an easy way to find particular text built from RichText in a Flutter test?
例如,我可能在当前的小部件树中有一个 RichText
,看起来像
RichText(
text: TextSpan(
text: 'Hello ',
style: DefaultTextStyle.of(context).style,
children: <TextSpan>[
TextSpan(text: 'bold', style: TextStyle(fontWeight: FontWeight.bold)),
TextSpan(text: ' world!'),
],
),
)
我尝试使用 find.text('Hello bold world!')
但它不起作用,因为它不是文本。
最简单的解决方案是在 RichText 上放置一个键并以这种方式读取它。
如果出于某种原因这不合适,您可以使用 find.byWidgetPredicate 并传递一个匹配 RichText 小部件的函数,其 text.toPlainText() returns 您想要的字符串。
我通过手动深入研究小部件解决了这个问题
final richTextWidget = tester.element(richTextFinder).widget as RichText;
print(richTextWidget.text.children);
有了 children,我可以断言它们是按预期生成的
这是 find.byWidgetPredicate 调用。
find.byWidgetPredicate((widget) => fromRichTextToPlainText(widget) == 'Hello bold world!')
这是 fromRichTextToPlainText 辅助函数。将 RichText 小部件传递给它,它将 return 纯文本。
String fromRichTextToPlainText(final Widget widget) {
if (widget is RichText) {
if (widget.text is TextSpan) {
final buffer = StringBuffer();
(widget.text as TextSpan).computeToPlainText(buffer);
return buffer.toString();
}
}
return null;
}
框架解决方案
我最近 contributed 将此功能添加到 Flutter 框架,即内置查找器中。
find.text()
您现在可以启用 findRichText
parameter,然后它还会找到独立的 RichText
小部件:
find.text(
'Hello bold world!',
findRichText: true,
)
例如,我可能在当前的小部件树中有一个 RichText
,看起来像
RichText(
text: TextSpan(
text: 'Hello ',
style: DefaultTextStyle.of(context).style,
children: <TextSpan>[
TextSpan(text: 'bold', style: TextStyle(fontWeight: FontWeight.bold)),
TextSpan(text: ' world!'),
],
),
)
我尝试使用 find.text('Hello bold world!')
但它不起作用,因为它不是文本。
最简单的解决方案是在 RichText 上放置一个键并以这种方式读取它。
如果出于某种原因这不合适,您可以使用 find.byWidgetPredicate 并传递一个匹配 RichText 小部件的函数,其 text.toPlainText() returns 您想要的字符串。
我通过手动深入研究小部件解决了这个问题
final richTextWidget = tester.element(richTextFinder).widget as RichText;
print(richTextWidget.text.children);
有了 children,我可以断言它们是按预期生成的
这是 find.byWidgetPredicate 调用。
find.byWidgetPredicate((widget) => fromRichTextToPlainText(widget) == 'Hello bold world!')
这是 fromRichTextToPlainText 辅助函数。将 RichText 小部件传递给它,它将 return 纯文本。
String fromRichTextToPlainText(final Widget widget) {
if (widget is RichText) {
if (widget.text is TextSpan) {
final buffer = StringBuffer();
(widget.text as TextSpan).computeToPlainText(buffer);
return buffer.toString();
}
}
return null;
}
框架解决方案
我最近 contributed 将此功能添加到 Flutter 框架,即内置查找器中。
find.text()
您现在可以启用 findRichText
parameter,然后它还会找到独立的 RichText
小部件:
find.text(
'Hello bold world!',
findRichText: true,
)