17

例如,我可能在当前小部件树中有一个 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!')但它不起作用,因为它不是文本。

4

4 回答 4

19

最简单的解决方案是在 RichText 上放一个键并以这种方式阅读。

如果由于某种原因这不合适,您可以使用 find.byWidgetPredicate 并传递一个与 RichText 小部件匹配的函数,该小部件的 text.toPlainText() 返回您想要的字符串。

于 2016-12-14T22:47:16.647 回答
11

这是 find.byWidgetPredicate 调用。

find.byWidgetPredicate((widget) => fromRichTextToPlainText(widget) == 'Hello bold world!')

这是 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;
}
于 2020-03-21T17:31:36.523 回答
8

框架解决方案

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

find.text()

您现在可以启用一个findRichText参数,然后它还会找到独立的RichText小部件:

find.text(
  'Hello bold world!',
  findRichText: true,
)

免责声明:由于我最近才提供此内容,因此您可能无法在稳定频道上使用它。尝试flutter channel masterflutter channel dev代替。

于 2021-08-27T00:08:22.063 回答
1

我通过更手动地挖掘小部件来解决这个问题

    final richTextWidget = tester.element(richTextFinder).widget as RichText;
    print(richTextWidget.text.children);

对于孩子,我可以断言它们是按预期生成的

于 2020-02-25T17:15:53.297 回答