При тестировании виджета Flutter я, похоже, не могу найти виджет, хотя могу найти его дочерних и родительских элементов

#flutter #flutter-test

Вопрос:

Я пытаюсь провести тест виджета, и у меня есть такой виджет, и объекты в элементе = [] равны 4:

     Widget _generateNodesWidget() {
    return ListView(
      children: [
        Padding(
            padding: const EdgeInsets.all(10.0),
            child: ExpansionPanelList(
              expansionCallback: (int index, bool isExpanded) {
                setState(() {
                  _items[index].isExpanded = !_items[index].isExpanded;
                  //TODO: Implement the call to blocks widget here
                  _items[index].body = _items[index].node.blocks.isEmpty ? _buildBlankBlockTile() : BlockWidget(nodeElement: _items[index],);
                });
              },
              children: _items.map((NodeElement item) {
                return ExpansionPanel(
                  headerBuilder: (BuildContext context, bool isExpanded) {
                    return Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: NodeWidget(node: item.node),
                    );
                  },
                  isExpanded: item.isExpanded,
                  body: item.body,
                );
              }).toList(),
            ))
      ],
    );
  }
 

выполнение этих тестов ниже также работает:

  testWidgets('Verify the completion of the first call ',
      (WidgetTester tester) async {
    await tester.pumpWidget(
      ChangeNotifierProvider<NodesProvider>(
        create: (_) => NodesProvider(),
        child: const MediaQuery(
          data: MediaQueryData(),
          child: MaterialApp(
            home: ToysScreen(),
          ),
        ),
      ),
    );

    await tester.pumpAndSettle();

    expect(find.byType(NodeWidget), findsNWidgets(4)); // this finds the NodeWidget
    expect(find.byType(ExpansionPanelList), findsNWidgets(1)); // this finds the ExpansionPanelList
expect(find.byType(ListView), findsNWidgets(1)); // this finds the ListView
  });
 

но приведенный ниже код никогда не работает, даже если панель расширения является родительской NodeWidget и дочерней ExpansionListTile :

 expect(find.byType(ExpansionPanel), findsNWidgets(4)); // it fails cause it 0 even tho there are 4 ExpansionPanel displayed on Screen;
 

В чем может быть проблема?

Ответ №1:

ExpansionPanel-это не виджет, а скорее класс, который содержит свойство виджета в качестве дочернего элемента.