在 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

的祖先