Не удается найти виджет по ключу, даже если он находится в дереве - PullRequest
0 голосов
/ 12 апреля 2020

Каковы возможные причины, по которым виджет не обнаруживается по ключу в тесте, даже если он находится в дереве виджетов?

Итак, в моем приложении есть несколько категорий веб-сайтов и в каждой категории есть кнопка +, чтобы пользователи могли добавлять свои собственные. Теперь я хочу проверить, правильно ли открывается страница при нажатии кнопки +. Если я просто сделаю:

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, но это также не помогло, сказав, что он не может найти виджет.

Что я делаю не так?

...