我有一段代码可以创建一个文本表小部件,如下所示:
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
属性以获得单词toffee
?
现在看来,我所能做的就是检查不理想的.toString().contains('toffee')
。
答案 0 :(得分:4)
您可以将firstCell
投射到Text
。
var firstCell = find
.descendant(
of: find.byType(Table),
matching: find.byType(Text),
)
.evaluate()
.whereType<Text>()
.first;
然后测试firstCell.data
expect(firstCell.data, 'toffee');
答案 1 :(得分:1)
按文字查找?
expect(find.text('toffee'), findsOneWidget);
答案 2 :(得分:0)
Rémi的示例不太奏效-在他回答时可能已经奏效,但是此时致电whereType<Text>()
将始终返回空的Iterable
,因为evaluate()
返回{{ 1}},而不是Iterable<Element>
。但是,您可以通过在其上调用Iterable<Widget>
来获得Element
的小部件,因此以下代码应该可以工作:
.widget
OP非常接近具有有效的代码-只有2个小问题:
Text firstText = find
.descendant(
of: find.byType(Table),
matching: find.byType(Text),
)
.evaluate()
.first
.widget;
expect(firstText.data, 'toffee');
而不是var
,变量的类型为Text
Widget
与Widget
进行了比较-这永远不可能返回true-在这种情况下,其目的是将String
与Widget
的属性进行比较String
中的Text
的值是通过调用String
.data
获得的
编辑:
Text
现在具有用于检索窗口小部件的实用程序功能:WidgetTester
,widget(Finder)
,widgetList(Finder)
和firstWidget(Finder)
。因此,对于OP的用例,您将像这样使用allWidgets
:
firstWidget
答案 3 :(得分:0)
您可以对任何类型的小部件使用缩写形式:
expect(
(find.byType(InAppWebView).evaluate().single.widget as InAppWebView)
.initialUrl,
'https://www.google.com/');