在提供者的消费者小部件内的测试中找不到小部件

Flu*_*ned 5 flutter flutter-test flutter-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));
    });
Run Code Online (Sandbox Code Playgroud)

该小部件是一个有状态的小部件,它使用 ChangeNotifierProvider 并且消费者围绕着一个包含三个“TextFormFields”的列表。

Consumer<State>(
   builder: (context, value, child)=> Column(
       children: [TextFormField(...), TextFormField(...), TextFormField(...)];
   )
)
Run Code Online (Sandbox Code Playgroud)

预期:小部件树中正好有 3 个匹配节点

实际:_ElementTypeFinder:

其中:意味着没有找到,但有些是预期的

不幸的是,我收到在小部件树中找不到小部件。

cam*_*777 8

似乎可以使用以下方法解决:

final textFormFieldFinder = find.byType(TextFormField);
Run Code Online (Sandbox Code Playgroud)

代替:

final textFormFieldFinder = find.byElementType(TextFormField);
Run Code Online (Sandbox Code Playgroud)


Max*_*lin 6

如前所述,您应该使用find.byTypewhich 旨在搜索 Widgets 而不是find.byElementTypewhich 处理元素。

Flutter 有 3 个构建 UI 块:

Widgets(immutable) -> Elements(mutable) -> Render Objects -- 它们不是相互继承的,它们是具有不同目的的不同类型的对象。

TextFormField是 a Widget,而它正在被传递给find.byElementType它的祖先Element