#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 , который может помочь