7

在我的应用程序中,我使用FlatButton.iconFlutter docs)创建了一个按钮。现在我试图在测试期间找到按钮。

我试过了

find.byType(MaterialButton); // -> zero widgets
find.byType(FlatButton); // -> zero widget

奇怪的是我可以找到按钮的文本

find.text('my button text');

我还可以找到按钮的图标

find.byType('Icon');

我不确定我应该搜索什么来找到该按钮。

4

3 回答 3

4

好的,所以我无法找到 FlatButton 本身,但很容易找到带有 . . .

find.byIcon(Icons.yourIcon);

有关更多信息,请参阅相关文档:flutter_test find.byIcon

于 2020-06-19T09:35:13.833 回答
2

尽管这个问题可能看起来很老,但我想扩展这个主题,因为没有一个答案实际上显示了如何找到 FlatButton 本身。问题在于,FlatButton.icon它不是构造函数,而是创建不同对象的工厂_FlatButtonWithIconextends FlatButton,这显然只能在其文件中使用。同时,find.byType仅查找相同类型的小部件 - 它不适用于派生类型。

因此,要返回对象本身:find.ancestor(of: find.byIcon(Icons.your_icon), matching: find.byWidgetPredicate((widget) => widget is FlatButton)). 这种方法让我们得到按钮对象,因此通过调用来测试它的属性(例如, onPressed)或子小部件(例如,labelfind.descendant

于 2020-09-27T10:09:22.430 回答
0

我遇到了这个问题,并从颤动的不和谐服务器那里得到了一些帮助,在这里我分享了解决方案:注意:您必须对返回的小部件使用动态,因为该类是私有的。

void main() {
  testWidgets('TextButton.icon test', (WidgetTester tester) async {
    const IconData iconData = Icons.add;

    await tester.pumpWidget(
      MaterialApp(
        home: Center(
          child: TextButton.icon(
            onPressed: () { },
            icon: const Icon(iconData),
            label: const Text('text button'),
          ),
        ),
      ),
    );
    final dynamic textButtonWithIconWidget = tester.widget(find.byWidgetPredicate((Widget widget) => '${widget.runtimeType}' == '_TextButtonWithIconChild'));
    expect(textButtonWithIconWidget.icon, const Icon(iconData));
  });
}
于 2020-12-22T17:31:38.760 回答