在 Provider 的 Consumer Widget 内部测试中找不到 Widget
Cannot find Widgets in test inside of Consumer Widget of Provider
我为我的小部件创建了以下 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(...)];
)
)
Expected: exactly 3 matching nodes in the widget tree
Actual: _ElementTypeFinder:
Which: means none were found but some were expected
不幸的是,我收到在小部件树中找不到小部件的消息。
似乎可以通过以下方式解决:
final textFormFieldFinder = find.byType(TextFormField);
而不是:
final textFormFieldFinder = find.byElementType(TextFormField);
如前所述,您应该使用旨在搜索小部件的 find.byType
而不是处理元素的 find.byElementType
。
Flutter 有 3 个 UI 构建块:
Widgets
(不可变)-> Elements
(可变)-> Render Objects
-- 它们不是相互继承的,它们是具有不同用途的不同类型的对象。
TextFormField
是一个 Widget
,而它被传递给 find.byElementType
,它期望 Element
的祖先
我为我的小部件创建了以下 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(...)];
)
)
Expected: exactly 3 matching nodes in the widget tree
Actual: _ElementTypeFinder:
Which: means none were found but some were expected
不幸的是,我收到在小部件树中找不到小部件的消息。
似乎可以通过以下方式解决:
final textFormFieldFinder = find.byType(TextFormField);
而不是:
final textFormFieldFinder = find.byElementType(TextFormField);
如前所述,您应该使用旨在搜索小部件的 find.byType
而不是处理元素的 find.byElementType
。
Flutter 有 3 个 UI 构建块:
Widgets
(不可变)-> Elements
(可变)-> Render Objects
-- 它们不是相互继承的,它们是具有不同用途的不同类型的对象。
TextFormField
是一个 Widget
,而它被传递给 find.byElementType
,它期望 Element