Flutter: ожидание ответа диалогового окна с предупреждением внутри функции onWillAccept DragTarget - PullRequest
0 голосов
/ 29 марта 2020

Я недавно начал изучать Flutter, и я застрял в какой-то момент, работая с Drag and Drop, используя Droppable и DragTarget. Когда я перетаскиваю свой перетаскиваемый элемент поверх элемента DropTarget, я делаю несколько проверок в методе onWillAccept . Одно из условий здесь требует, чтобы я подтвердил пользователю, готовы ли они продолжать свои действия, прежде чем вернуть true и перейти к методу onAccept . По какой-то причине выполнение кода не ожидает возврата действий пользователя.

Вот так выглядит мой DragTarget

DragTarget<Map>(
  builder: (context, listOne, listTwo) {
    return Container();
  },
  onWillAccept: (value) {
    if(condition1) {
      return true;
    } else if(condition2) {
      return true;
    } else {
      if(!condition3) {
        return true;
      } else {
        await _showConfirmation();
        return false;
      }
    }
  },
  onAccept: (value) {
    print(value);
  },
)

и _showConfirmation метод выглядит примерно так

Future<void> _showConfirmation() async {
  return showDialog<void>(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text('Attention'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              Text('Some message")
            ],
          ),
        ),
        actions: <Widget>[
          FlatButton(
            child: Text('Accept'),
            onPressed: () {
              Navigator.of(context).pop();
              return true;
            },
          ),
          FlatButton(
            child: Text('Cancel'),
            onPressed: () {
              Navigator.of(context).pop();
              return false;
            },
          )
        ],
      );
    },
  );
}

Добавление await не помогает как onWillAccept не асин c. Сделать асин c тоже не помогло.

_showConfirmation().then((result) {
  return result
})

Выше код тоже не помог. Во многих случаях перетаскиваемый объект остается нависшим над полем DragTarget.

Любая помощь по этому вопросу будет принята, спасибо.

...