Каковы возможные причины, по которым виджет не обнаруживается по ключу в тесте, даже если он находится в дереве виджетов?
Итак, в моем приложении есть несколько категорий веб-сайтов и в каждой категории есть кнопка +, чтобы пользователи могли добавлять свои собственные. Теперь я хочу проверить, правильно ли открывается страница при нажатии кнопки +. Если я просто сделаю:
await tester.tap(find.byIcon(Icons.add));
Тест не пройден, потому что он находит слишком много виджетов и не знает, какой из них нажать. Поэтому я решил дать ключи своим кнопкам +, завернув их в контейнер, подобный этому:
Container(
key: ValueKey('add_website_' + category.toLowerCase()),
child: AddWebsiteButton(), // the tappable widget that contains an Icon(Icons.add)
)
Теперь в моем тесте я звоню:
expect(find.byKey(ValueKey('add_website_learning')), findsOneWidget);
И, вот и вот, это терпит неудачу:
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
Expected: exactly one matching node in the widget tree
Actual: _KeyFinder:<zero widgets with key [<'add_website_learning'>] (ignoring offstage widgets)>
Which: means none were found but one was expected
Если я позвоню debugDumpApp()
непосредственно перед вызовом выше, я вижу, что Контейнер с этим ключом фактически находится в дереве виджетов:
...
└KeyedSubtree-[Key <[<add_website_learning>]>]
└AutomaticKeepAlive(state: _AutomaticKeepAliveState#470b4(handles: no notifications ever received))
└KeepAlive(keepAlive: false)
└NotificationListener<KeepAliveNotification>
└IndexedSemantics(index: 4, renderObject: RenderIndexedSemantics#02bbd relayoutBoundary=up3 NEEDS-PAINT)
└RepaintBoundary(renderObject: RenderRepaintBoundary#8170e relayoutBoundary=up4 NEEDS-PAINT)
└Container-[<add_website_learning>]
└Tooltip("Add website", dependencies: [_LocalizationsScope-[GlobalKey#55b7a], _InheritedTheme, TickerMode-[<CrossFadeState.showSecond>]], state: _TooltipState#87315(ticker inactive))
└GestureDetector(startBehavior: start)
...
Я попытался убедиться, что он виден, позвонив по номеру ensureVisible
, но это также не помогло, сказав, что он не может найти виджет.
Что я делаю не так?