flutter - 在提供者的消费者小部件内部的测试中找不到小部件
问题描述
我为我的小部件创建了以下 Flutter 测试
testWidgets("", (WidgetTester tester) async {
await tester.pumpWidget(
ChangeNotifierProvider<SettingsViewProvider>(
create: (context) => SettingsViewProvider(),
child: MaterialApp(
localizationsDelegates: [S.delegate],
home: SettingsScreen(),
),
),
);
final textFormFieldFinder = find.byElementType(TextFormField);
await tester.pump();
expect(textFormFieldFinder, findsNWidgets(3));
});
该小部件是一个有状态的小部件,它使用 ChangeNotifierProvider 并且消费者围绕着一个由三个“TextFormFields”组成的列表。
Consumer<State>(
builder: (context, value, child)=> Column(
children: [TextFormField(...), TextFormField(...), TextFormField(...)];
)
)
预期:小部件树中恰好有 3 个匹配节点
实际:_ElementTypeFinder:
其中:意味着没有找到,但有些是预期的
不幸的是,我收到在小部件树中找不到小部件。
解决方案
如前所述,您应该使用find.byType
which 旨在搜索小部件,而不是find.byElementType
使用 which 处理元素。
Flutter 有 3 个 UI 构建块:
Widgets
(immutable) -> Elements
(mutable) -> Render Objects
-- 它们不是相互继承的,它们是具有不同目的的不同类型的对象。
TextFormField
是 a Widget
,当它被传递给find.byElementType
which 期望的祖先时Element
推荐阅读
- javascript - 将数据从函数内部的变量传递给声明的变量
- javascript - Chart.js - 未捕获的 TypeError:Object.defineProperty 在多个图表的非对象上调用
- java - 如何在 Constraintlayout 中 ImageView 的特定位置添加点
- android - 为什么不在 Android 上的 Kotlin 中重新格式化 XML 代码
- python - 线段和三角形之间的 3d 交点
- .net - 如何使用 wix 安装程序安装和启动 Windows 服务?
- z3 - 使用量词找到 SMT 系统解决方案的复杂性
- sql-server - SQL CASE 在 sql server 的存储过程中检查同一列中的两个条件
- angular - 如何在 Angular6 + 电子中设置标题引用者?
- c# - 对已发布的 web-api 执行单元测试