Драйвер Flutter - не находит Flutter AlertDialog и его элементы

У меня флаттер AlertDiaogэто появляется в моем приложении Flutter. Используя драйвер Flutter, я не могу нажать ни на Flutter AlertDialog, ни на какой-либо элемент AlertDialog. Есть ли способ нажать на любой AlertDialog, который появляется в моем приложении?

Я пробовал все нижеприведенное, но все равно не повезло:

  1. Первый:
    await driver.tap(find.byType('ModalBarrier'));
    print('*******TAPPED - ModalBarrier*******');
  1. Второй
    await driver.tap(find.byType('AlertDialog'));
    print('*******TAPPED - AlertDialog*******');
  1. В третьих
     await driver.tap(find.text('Gallery')); // Tapping 'Gallery', can access pics
     print('*******TAPPED - Gallery *******');

1 ответ

Идея состоит в том, чтобы сначала идентифицировать текст в AlertDialog уникальным ключом, сообщить об этом водителю, а затем выполнить tapдействие на нем. В свой основной код добавьтеkey свойство родительского виджета, имеющего Text вы хотите нажать, например: я показываю простой AlertDialog которые показывают 2 варианта, как показано ниже:

Код для этого:

showDialog(context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: SingleChildScrollView(
              child: ListBody(
                children: <Widget>[
                  GestureDetector(
                    key: Key('firstOptionKey'),
                    child: Text('Take a picture'),
                    onTap: () {},
                  ),
                  Padding(
                    padding: EdgeInsets.all(8.0),
                  ),
                  GestureDetector(
                    key: Key('secondOptionKey'),
                    child: Text('Select from gallery'),
                    onTap: () {},
                  ),
                ],
              ),
            ),
          );
        });

Как видите, я заключил оба текста в GestureDetectorчто позволяет нам нажимать на них. Также я использовалkey собственность для каждого GestureDetector чтобы однозначно идентифицировать оба текста.

Затем в тесте драйвера вам просто нужно идентифицировать каждый текст, используя byValueKey и попросите водителя нажать на него, как показано ниже:

test('test dialog', () async {

          final firstText = find.byValueKey('firstOptionKey');
          await driver.waitFor(find.text('Tap'));  
          await driver.tap(find.text('Tap'));   // tap on this button to open alertDialog
          await driver.waitFor(firstText);      // wait for flutter driver to locate and identify the element on screen
          await driver.tap(firstText);
          print('tapped on it');
        });

Надеюсь, что это ответ на ваш вопрос.

Другие вопросы по тегам