查找部件
要在一个测试环境中定位部件,请使用 Finder
类。虽然可以编写你自己的 Finder
类,但通常使用 flutter_test
包提供的工具来定位部件更为方便。
在 flutter run
会话的部件测试期间,你还可以交互式地点击屏幕上的部分区域,让 Flutter 工具打印建议的 Finder
。
此食谱介绍了 flutter_test
包提供的 find
常量,并演示了如何使用它提供的一些 Finder
。有关可用查找器的完整列表,请参阅 CommonFinders
文档。
如果你不熟悉部件测试和 Finder
类的作用,请查看 部件测试简介 食谱。
此食谱使用以下步骤:
- 查找一个
Text
部件。 - 查找具有特定
Key
的部件。 - 查找特定部件实例。
1. 查找一个 Text
部件
#在测试中,你经常需要查找包含特定文本的部件。这正是 find.text()
方法的作用。它创建一个 Finder
,用于搜索显示特定文本 String
的部件。
testWidgets('finds a Text widget', (tester) async {
// 构建一个包含显示字母“H”的 Text 部件的 App。
await tester.pumpWidget(const MaterialApp(
home: Scaffold(
body: Text('H'),
),
));
// 查找显示字母“H”的部件。
expect(find.text('H'), findsOneWidget);
});
2. 查找具有特定 Key
的部件
#在某些情况下,你可能希望根据已提供给它的 Key 来查找部件。如果显示同一个部件的多个实例,这将非常有用。例如,ListView
可能会显示几个包含相同文本的 Text
部件。
在这种情况下,请为列表中的每个部件提供一个 Key
。这允许应用程序唯一标识特定部件,从而更容易在测试环境中找到该部件。
testWidgets('finds a widget using a Key', (tester) async {
// 定义测试键。
const testKey = Key('K');
// 使用 testKey 构建一个 MaterialApp。
await tester.pumpWidget(MaterialApp(key: testKey, home: Container()));
// 使用 testKey 查找 MaterialApp 部件。
expect(find.byKey(testKey), findsOneWidget);
});
3. 查找特定部件实例
#最后,你可能希望找到特定部件实例。例如,当创建采用 child
属性的部件时,这将非常有用,并且你希望确保正在渲染 child
部件。
testWidgets('finds a specific instance', (tester) async {
const childWidget = Padding(padding: EdgeInsets.zero);
// 将 childWidget 提供给 Container。
await tester.pumpWidget(Container(child: childWidget));
// 在树中搜索 childWidget 并验证其是否存在。
expect(find.byWidget(childWidget), findsOneWidget);
});
总结
#flutter_test
包提供的 find
常量提供了在测试环境中定位部件的几种方法。此食谱演示了其中的三种方法,还有其他几种方法用于不同的目的。
如果上述示例不适用于特定用例,请参阅 CommonFinders
文档 以查看所有可用方法。
完整示例
#import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('finds a Text widget', (tester) async {
// 构建一个包含显示字母“H”的 Text 部件的 App。
await tester.pumpWidget(const MaterialApp(
home: Scaffold(
body: Text('H'),
),
));
// 查找显示字母“H”的部件。
expect(find.text('H'), findsOneWidget);
});
testWidgets('finds a widget using a Key', (tester) async {
// 定义测试键。
const testKey = Key('K');
// 使用 testKey 构建一个 MaterialApp。
await tester.pumpWidget(MaterialApp(key: testKey, home: Container()));
// 使用 testKey 查找 MaterialApp 部件。
expect(find.byKey(testKey), findsOneWidget);
});
testWidgets('finds a specific instance', (tester) async {
const childWidget = Padding(padding: EdgeInsets.zero);
// 将 childWidget 提供给 Container。
await tester.pumpWidget(Container(child: childWidget));
// 在树中搜索 childWidget 并验证其是否存在。
expect(find.byWidget(childWidget), findsOneWidget);
});
}
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。