有没有一种简单的方法可以在Flutter测试中找到从RichText构建的特定文本?

Wei*_*ong 4 flutter

例如,我可能在当前的小部件树中有一个RichText,看起来像

new RichText(
 text: new TextSpan(
   text: 'Hello ',
   style: DefaultTextStyle.of(context).style,
   children: <TextSpan>[
     new TextSpan(text: 'bold', style: new TextStyle(fontWeight: FontWeight.bold)),
     new TextSpan(text: ' world!'),
   ],
 ),
)
Run Code Online (Sandbox Code Playgroud)

我尝试使用,find.text('Hello bold world!')但因为它不是文本,所以无法使用。

cre*_*not 34

框架解决方案

我最近将此功能贡献给了 Flutter 框架,即内置的查找器。

find.text()

您现在可以启用一个findRichText参数,该参数也将找到独立的RichText小部件:

find.text(
  'Hello bold world!',
  findRichText: true,
)
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了!非常感谢您的贡献,这在稳定版中会很棒! (4认同)
  • 好的!你也可以做`find.textContaining()`吗?:) (3认同)

Bie*_*vid 8

这是 find.byWidgetPredicate 调用。

find.byWidgetPredicate((widget) => fromRichTextToPlainText(widget) == 'Hello bold world!')
Run Code Online (Sandbox Code Playgroud)

这是 fromRichTextToPlainText 辅助函数。将 RichText 小部件传递给它,它将返回纯文本。

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;
}
Run Code Online (Sandbox Code Playgroud)


Ian*_*son 7

最简单的解决方案是将密钥放在RichText上,然后以这种方式读取。

如果由于某种原因这不是一个很好的选择,则可以使用find.byWidgetPredicate并传递一个与RichText小部件相匹配的函数,这些小部件的text.toPlainText()返回所需的字符串。

  • 谢谢,第二种解决方案将是这样: (2认同)