【问题标题】:Is there an easy way to find particular text built from RichText in a Flutter test?有没有一种简单的方法可以在 Flutter 测试中找到从 RichText 构建的特定文本?
【发布时间】:2017-04-30 08:34:00
【问题描述】:

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

【问题讨论】:

    标签: flutter dart flutter-test


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,第二个解决方案是:expect(find.byWidgetPredicate((Widget widget) =&gt; widget is RichText &amp;&amp; widget.text.toPlainText() == 'Hello bold world'), findsOneWidget);
    • 在我的情况下,widget.text.toPlainText() 实际上在末尾包含 0 宽度的空格字符(可能是因为空跨度)。我让它工作的唯一方法是使用 .startsWith :(widget) =&gt; widget is RichText &amp;&amp; widget.text.toPlainText().startsWith('hello')
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      框架解决方案

      我最近contributed这个特性到了 Flutter 框架,也就是内置的finders。

      find.text()

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

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

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

      【讨论】:

      • 这太棒了!非常感谢您的贡献,这在稳定版中会很棒!
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 2013-11-30
        相关资源
        最近更新 更多