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

fslejnso  于 2023-10-13  发布在  Flutter
关注(0)|答案(5)|浏览(86)

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

tp5buhyn

tp5buhyn1#

框架解决方案

我最近把contributed这个特性移植到Flutter框架中,到内置的搜索器

find.text()

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

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

vc6uscn92#

最简单的解决方案是在RichText上放置一个键,并以这种方式读取它。
如果出于某种原因这不是一个很好的方法,您可以使用find.byWidgetPredicate并传递一个匹配RichText小部件的函数,其text.toPlainText()返回您想要的字符串。

uplii1fm

uplii1fm3#

这是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;
}
i34xakig

i34xakig4#

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

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

对于子级,我可以Assert它们是按预期生成的

8oomwypt

8oomwypt5#

您可以通过像这样启用findRichText: true来简单地实现这一点,

expect(find.text("${input.newItem.price.toPrice}/${weight!.unit}", findRichText: true), findsOneWidget);

相关问题