Как показать 2 последовательных диалога во Flutter

У меня есть список с виджетом "Отклоняемый". Когда пользователь меняет startToEnd, я хотел бы создать диалог, когда пользователь может добавить заметку. После того, как пользователь нажмет "ОК" в этом диалоговом окне, я бы хотел, чтобы появилось еще одно диалоговое окно, чтобы подтвердить добавление примечания, а затем исчезнуть через 2 секунды. Когда пользователь меняет местами справа налево, я хотел бы показать диалог с сообщением на 2 секунды.

Вот мой код

  List<Container> _buildBasketList() {
    return appData.basketList.map((bList) {
      var container = Container(
        child: Builder(
          builder: (context) => Dismissible(
            key: Key(UniqueKey().toString()),
            background: Container(
              margin: EdgeInsets.all(8.0),
              color: kColorAccent,
              child: Align(
                  alignment: Alignment(-0.90, 0.00),
                  child: Icon(Icons.add_comment)),
            ),
            onDismissed: (direction) async {
              print('ondismiss  started');
              if (direction == DismissDirection.startToEnd) {
                print('adding a note');
                await showDialog(
                    context: context,
                    builder: (context) => AddDetailsInDialog(
                          dialogText: 'Enter your note',
                          hintText: 'eg. xxx',
                        )).then((value) async {
                  if (value != null) {
                    print('got value');
                    await showDialog(
                        context: context,
                        builder: (context) => ShowAlertAndAutoDismiss(
                              text: 'Note added',
                            ));
                  }
                });
              } else {
                print('deleting record in basketList');
                await showDialog(
                    context: context,
                    builder: (context) => ShowAlertAndAutoDismiss(
                          text:
                               "Item removed from your list",
                        ));
              }
            },

Вот мои классы

class ShowAlertAndAutoDismiss extends StatelessWidget {
  final String text;
  ShowAlertAndAutoDismiss({this.text});

  @override
  Widget build(BuildContext context) {
    print('building ShowAlertAndAutoDismiss');
    Future.delayed(Duration(milliseconds: 1000)).then((_) {
      print('ziiiip');
    });
    return AlertDialog(
      title: Center(child: Text(text)),
    );
  }
}
class AddDetailsInDialog extends StatelessWidget {
  final String dialogText;
  final String hintText;
  final myController = TextEditingController();

  AddDetailsInDialog({
    this.dialogText,
    this.hintText,
  });

  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Text(dialogText),
      content: new Row(
        children: <Widget>[
          new Expanded(
              child: new TextField(
            controller: myController,
            autofocus: true,
            decoration: new InputDecoration(hintText: hintText),
          ))
        ],
      ),
      actions: <Widget>[
        FlatButton(
          child: Text('OK'),
          onPressed: () {
            Navigator.of(context).pop(myController.toString());
          },
        ),
      ],
    );
  }

  @override
  void dispose() {
    myController.dispose();
  }
}

Теперь по какой-то странной причине ShowAlertAndAutoDismiss внутри AddDetailsInDialog вызывался дважды... ммм?

Вот журнал, который я получаю, если меняю местами справа налево (удаление), а затем смахиваю слева направо (добавление примечания). удаление работает, но addNote вызывается 2 раза. Почему??? кто-нибудь понимает почему?

Журнал, когда я удаляю

I/flutter ( 7941): ondismiss  started
I/flutter ( 7941): deleting record in basketList
I/flutter ( 7941): building ShowAlertAndAutoDismiss
I/flutter ( 7941): ziiiip

Журнал, когда я добавляю заметку

I/flutter ( 7941): ondismiss  started
I/flutter ( 7941): adding a note
I/flutter ( 7941): got value
I/flutter ( 7941): building ShowAlertAndAutoDismiss
I/flutter ( 7941): building ShowAlertAndAutoDismiss
I/flutter ( 7941): ziiiip
I/flutter ( 7941): ziiiip

1 ответ

Решение

Итак, я решил, переместив ShowAlertAndAutoDismiss в функцию

void alertToDismiss() {
    showDialog(
        context: context,
        builder: (context) => ShowAlertAndAutoDismiss(
              text: 'Note added',
            ));
  }

...

await showDialog(
                    context: context,
                    builder: (context) => AddDetailsInDialog(
                          dialogText: 'Enter your note',
                          hintText: 'eg. xxx',
                        )).then((value) async {
                  if (value != null) {
                    print('got value');
                    alertToDismiss():
                  }

Похоже, этот виджет ведет себя как FutureBuilder, и построитель сначала сразу вызывается с нулевым значением, а затем после разрешения будущего

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