代码之家  ›  专栏  ›  技术社区  ›  Mary

如何在flatter测试期间找到小部件的“text”属性?

  •  2
  • Mary  · 技术社区  · 6 年前

    我有一段代码可以创建一个文本小部件表,如下所示:

    return Table(
      defaultColumnWidth: FixedColumnWidth(120.0),
      children: <TableRow>[
        TableRow(
          children: <Widget>[Text('toffee'), Text('potato')],
        ),
        TableRow(
          children: <Widget>[Text('cheese'), Text('pie')],
        ),
      ],
    );
    

    我想测试一下,表中的第一项确实是“太妃糖”这个词。我设置了我的测试并进入这一部分:

    var firstCell = find
          .descendant(
            of: find.byType(Table),
            matching: find.byType(Text),
          )
          .evaluate()
          .toList()[0].widget;
    
      expect(firstCell, 'toffee');
    

    这肯定不行,因为 firstCell 是Widget类型,它不等于字符串 toffee

    我只看到一个 toString() 函数,如下所示:

    'Text("toffee", inherit: true, color: Color(0xff616161), size: 16.0,
     textAlign: left)'
    

    text 太妃糖

    现在看来我能做的就是检查 .toString().contains('toffee') 这并不理想。

    2 回复  |  直到 6 年前
        1
  •  6
  •   Rémi Rousselet    6 年前

    firstCell Text .

    var firstCell = find
        .descendant(
          of: find.byType(Table),
          matching: find.byType(Text),
        )
        .evaluate()
        .whereType<Text>()
        .first;
    

    然后测试 firstCell.data

    expect(firstCell.data, 'toffee');
    
        2
  •  2
  •   Ashfaque Ali Solangi    6 年前

    expect(find.text('toffee'), findsOneWidget);
    
        3
  •  2
  •   Ovidiu    5 年前

    Rmi的例子不太管用——在他回答的时候可能管用,但在这个时候 whereType<Text>() Iterable 因为 evaluate() 退货 Iterable<Element> Iterable<Widget> . 但是你可以得到一个 Element .widget 所以下面的代码应该可以工作:

    Text firstText = find
        .descendant(
          of: find.byType(Table),
          matching: find.byType(Text),
        )
        .evaluate()
        .first
        .widget;
    
    expect(firstText.data, 'toffee');
    

    OP非常接近于有工作代码-只有两个小问题:

    • 通过使用 var 而不是 Text ,变量的类型为 Widget
    • 这个 被比作 String 小装置 -如果是 文本 ,的 字符串 .data 文本

    编辑:

    WidgetTester 现在有了检索小部件的实用函数: widget(Finder) , widgetList(Finder) , firstWidget(Finder) allWidgets . 所以对于OP的用例 firstWidget

    Text firstText = tester.firstWidget(
        find.descendant(
          of: find.byType(Table),
          matching: find.byType(Text),
        ));
    
    expect(firstText.data, 'toffee');
    
        4
  •  0
  •   Ivan Shchukin    4 年前

    您可以对任何类型的小部件使用缩写:

    expect(
         (find.byType(InAppWebView).evaluate().single.widget as InAppWebView)
              .initialUrl,
              'https://www.google.com/');