AlertDialog не появится в flutter

#flutter #dart #button #dialog #flutter-web

#flutter #дротик #кнопка #диалоговое окно #flutter-web

Вопрос:

При длительном нажатии у меня есть элемент списка _selectionAlert , который имеет две кнопки, одну для удаления и одну для редактирования (см. Изображение). Удаление работает нормально, но когда я нажимаю на редактирование, оно должно выполняться _editAlert , что должно показывать другой AlertDialog, но когда я нажимаю на него, ничего не происходит, в чем проблема?
Это отвечает за отображение диалогового окна оповещения в _selectionAlert

 TextButton( // refer code bellow
    child: Text('Edit', style: TextStyle(color: Colors.grey)),
        onPressed: (){
            _editAlert();
            Navigator.of(context).pop();
        },
)
 

Этот приведенный ниже код выполняется при длительном нажатии элемента:

 void _selectionAlert(){
      var selItem = AlertDialog(
        title: Text('What you want to do?'),
        content: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            TextButton(       // ignore this it is for deletion this works fine
              child: Text('Delete', style: TextStyle(color: Colors.red)),
              onPressed: (){
                _deleteItem();
                Navigator.of(context).pop();
              },
            ),
            TextButton( 
              child: Text('Edit', style: TextStyle(color: Colors.grey)),
              onPressed: (){
                _editAlert();      // this line should call _editAlert
                Navigator.of(context).pop();
              },
            )
          ],
        ),
      );
      showDialog(
        context: context,
        builder: (BuildContext context){
          return selItem;
      }
    );
  }  
 

Представление приведенного выше кода:
представление приведенного выше кода

 void _editAlert(){   // edit alertDialog
    var editItem = AlertDialog(
      title: Text('Edit'),
      content: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          TextField(
            decoration: InputDecoration(
              hintText: 'Edit Item',
            ),
            controller: addeditem,
          ),
          TextButton(
            child: Text('Done'),
            onPressed: (){
              _editItem();
              Navigator.of(context).pop();
            }
          )
        ],
      ),
    );
    showDialog(
      context: context,
      builder: (BuildContext context){
        return editItem;
      }
    );
  }
 

PS: кнопка редактирования серого цвета, кнопка, безусловно, интерактивна, и я тестирую в Google Chrome.
С уважением

Комментарии:

1. Мне просто интересно, что я нажимаю _selectionAlert при нажатии на редактирование, но если он откроется, и я нажму готово, где он вернется при появлении? Я думаю, что должен быть другой способ вызова alertdialog в другом alertdialog

Ответ №1:

Попробуйте добавить оператор return в свой метод _editAlert

 _editAlert(){   // edit alertDialog
    var editItem = AlertDialog(
      title: Text('Edit'),
      content: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          TextField(
            decoration: InputDecoration(
              hintText: 'Edit Item',
            ),
            controller: addeditem,
          ),
          TextButton(
            child: Text('Done'),
            onPressed: (){
              _editItem();
              Navigator.of(context).pop();
            }
          )
        ],
      ),
    );
    return showDialog(                //like that
      context: context,
      builder: (BuildContext context){
        return editItem;
      }
    );
  }


 

Также ваш путь верен, вы можете использовать всплывающее окно для закрытия предыдущего всплывающего окна.

Комментарии:

1. У меня тип void, поэтому я не могу вернуть: ( Я пытался изменить возвращаемый тип на Future<AlertDialog>, не сработало, и что мне нужно делать с возвращаемым значением?

2. Вы можете использовать «динамический» возвращаемый тип для вашего метода. Или используйте Future<T> ShowDialog<T> но я не уверен в этом, вы можете просто использовать ‘dynamic’ . (динамический _editAlert(){….})

3. Да, сработало!, могу ли я получить некоторые ресурсы, чтобы узнать больше об этом?

4.StatefullBuilder , который может помочь