跳至主要内容

查找小部件

要在测试环境中定位小部件,请使用Finder 类。虽然可以编写自己的 Finder 类,但通常使用 flutter_test 包提供的工具来定位小部件更方便。

在小部件测试期间的 flutter run 会话中,您还可以交互式地点击屏幕上的部分,以便 Flutter 工具打印建议的 Finder

此示例介绍了 flutter_test 包提供的 find 常量,并演示了如何使用它提供的一些 Finder。有关可用查找器的完整列表,请参阅 CommonFinders 文档

如果您不熟悉小部件测试和 Finder 类的作用,请查看 小部件测试简介 示例。

此示例使用以下步骤

  1. 查找 Text 小部件。
  2. 查找具有特定 Key 的小部件。
  3. 查找特定的小部件实例。

1. 查找 Text 小部件

#

在测试中,您通常需要查找包含特定文本的小部件。这正是 find.text() 方法的作用。它创建一个 Finder,用于搜索显示特定 String 文本的小部件。

dart
testWidgets('finds a Text widget', (tester) async {
  // Build an App with a Text widget that displays the letter 'H'.
  await tester.pumpWidget(const MaterialApp(
    home: Scaffold(
      body: Text('H'),
    ),
  ));

  // Find a widget that displays the letter 'H'.
  expect(find.text('H'), findsOneWidget);
});

2. 查找具有特定 Key 的小部件

#

在某些情况下,您可能希望根据提供给小部件的 Key 来查找它。如果显示同一小部件的多个实例,这将非常有用。例如,ListView 可能会显示几个包含相同文本的 Text 小部件。

在这种情况下,请为列表中的每个小部件提供一个 Key。这允许应用程序唯一地识别特定的小部件,从而更容易在测试环境中找到该小部件。

dart
testWidgets('finds a widget using a Key', (tester) async {
  // Define the test key.
  const testKey = Key('K');

  // Build a MaterialApp with the testKey.
  await tester.pumpWidget(MaterialApp(key: testKey, home: Container()));

  // Find the MaterialApp widget using the testKey.
  expect(find.byKey(testKey), findsOneWidget);
});

3. 查找特定的小部件实例

#

最后,您可能希望定位小部件的特定实例。例如,这在创建采用 child 属性的小部件时非常有用,并且您希望确保正在渲染 child 小部件。

dart
testWidgets('finds a specific instance', (tester) async {
  const childWidget = Padding(padding: EdgeInsets.zero);

  // Provide the childWidget to the Container.
  await tester.pumpWidget(Container(child: childWidget));

  // Search for the childWidget in the tree and verify it exists.
  expect(find.byWidget(childWidget), findsOneWidget);
});

总结

#

flutter_test 包提供的 find 常量提供了在测试环境中定位小部件的几种方法。此示例演示了其中三种方法,并且还存在其他几种方法用于不同的目的。

如果以上示例不适用于特定用例,请参阅 CommonFinders 文档 以查看所有可用方法。

完整示例

#
dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('finds a Text widget', (tester) async {
    // Build an App with a Text widget that displays the letter 'H'.
    await tester.pumpWidget(const MaterialApp(
      home: Scaffold(
        body: Text('H'),
      ),
    ));

    // Find a widget that displays the letter 'H'.
    expect(find.text('H'), findsOneWidget);
  });

  testWidgets('finds a widget using a Key', (tester) async {
    // Define the test key.
    const testKey = Key('K');

    // Build a MaterialApp with the testKey.
    await tester.pumpWidget(MaterialApp(key: testKey, home: Container()));

    // Find the MaterialApp widget using the testKey.
    expect(find.byKey(testKey), findsOneWidget);
  });

  testWidgets('finds a specific instance', (tester) async {
    const childWidget = Padding(padding: EdgeInsets.zero);

    // Provide the childWidget to the Container.
    await tester.pumpWidget(Container(child: childWidget));

    // Search for the childWidget in the tree and verify it exists.
    expect(find.byWidget(childWidget), findsOneWidget);
  });
}