使用Flutter测试找到可点击的TextSpan

13

使用Flutter的WidgetTester,您如何点击TextSpan,就像下面的代码一样?

RichText(
  text: TextSpan(
    children: [
      TextSpan(text: 'aaa '),
      TextSpan(
        text: 'bbb ',
        recognizer: TapGestureRecognizer()
          ..onTap = () { 
            // How to reach this code in a widget test?
          },
      ),
      TextSpan(text: 'ccc'),
    ],
  ),
)

这个教程对你没有帮助吗? - Payam Asefi
@P4yam,不是因为TextSpan不是widget。但是被接受的答案很棒。 - Benno Richters
1个回答

27

使用 byWidgetPredicate 方法的 CommonFinders

InlineSpan 的 visitChildren 方法

查找 TextSpan:

final finder = find.byWidgetPredicate(
  (widget) => widget is RichText && tapTextSpan(widget, "bbb "),
);
bool findTextAndTap(InlineSpan visitor, String text) {
  if (visitor is TextSpan && visitor.text == text) {
    (visitor.recognizer as TapGestureRecognizer).onTap();

    return false;
  }

  return true;
}

bool tapTextSpan(RichText richText, String text) {
  final isTapped = !richText.text.visitChildren(
    (visitor) => findTextAndTap(visitor, text),
  );

  return isTapped;
}

FlutterDriver 中找不到 byWidgetPredicate 方法。 - Nalawala Murtuza
不是绝对的,但有助于理解流程。 - Anand Kumar Jha
2
这里有一个不错的解决方法:https://github.com/flutter/flutter/issues/56023#issuecomment-764985456 - mspnr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接