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

У меня есть Flutter 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 *******');

person Manmeet Chadha    schedule 01.12.2019    source источник


Ответы (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');
        });

введите здесь описание изображения

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

person Darshan    schedule 03.12.2019
comment
Даршан, спасибо за ответ. В вашем основном коде выше я вижу, что вы не использовали return при вызове showDialog (). Можете ли вы вернуть фотогалерею на экран, если добавите такое действие при нажатии {}? Для меня драйвер флаттера не мог найти AlertDialog до сих пор только потому, что я использую return для вызова showDialog (), так что фотогалерея фактически возвращается после нажатия. - person Manmeet Chadha; 18.12.2019
comment
Я попробовал на основе вашего ответа и напрямую вернул alertDialog методом onPressed, и он работает, как ожидалось. - person Darshan; 19.12.2019
comment
Решение сработало у меня только после того, как я использовал метод runUnsynchronized, например: await driver.runUnsynchronized (() async {await driver.tap (find.byValueKey ('firstOptionKey'));}); - person Manmeet Chadha; 21.12.2019