首页 > 解决方案 > 在提供者的消费者小部件内部的测试中找不到小部件

问题描述

我为我的小部件创建了以下 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:

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

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

标签: flutterflutter-testflutter-provider

解决方案


如前所述,您应该使用find.byTypewhich 旨在搜索小部件,而不是find.byElementType使用 which 处理元素。

Flutter 有 3 个 UI 构建块:

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

TextFormField是 a Widget,当它被传递给find.byElementTypewhich 期望的祖先时Element


推荐阅读