Флаттер: кнопка со значком нажата не работает с SimpleDialog

#flutter #flutter-layout

Вопрос:

У меня есть этот фрагмент кода:

 child: CircleAvatar(
         radius: 18,
         backgroundColor: Colors.white70,
         child: IconButton(
           icon: Icon(Icons.camera_alt_outlined),
           onPressed: () => selectPhoto(),
         ),
       )
 

И когда значок нажат, я хотел бы иметь простой диалог с парой опций, поэтому я написал это:

 selectPhoto() {
return SimpleDialog(
  title: const Text('Create Post'),
  children: <Widget>[
    SimpleDialogOption(...),
    SimpleDialogOption(...),
    SimpleDialogOption(...)
  ],
);
   }
 

Но когда я пытаюсь запустить приложение, ничего не происходит. Что я сделал не так? Как это решить? Ty

Ответ №1:

Возвращаемое значение вашей функции ни к чему не используется. Нет смысла возвращать а SimpleDialog в а onPressed . Функция onPressed будет вызвана виджетом, поэтому бесполезно присваивать ей возвращаемое значение.

Следуя документации, ваша функция должна вызвать showDialog метод:

  • Измените свою selectPhoto функцию:
 await showDialog(
      context: context,
      builder: (BuildContext context) {
        return SimpleDialog(
            title: const Text('Create Post'),
            children: <Widget>[
                SimpleDialogOption(...),
                SimpleDialogOption(...),
                SimpleDialogOption(...)
            ],
        );
      })
 

Метод ShowDialog отображает созданный вами диалог. Если вы хотите, вы можете сохранить результат в его возвращаемом значении:

 var result = await showDialog(
[...]
 

Таким образом, вы можете проверить, какая опция была нажата. Если пользователь отменяет диалоговое окно (например, нажав кнопку «Назад» на Android или нажав на маску за диалогом), то будущее завершается нулевым значением.

Вы можете прочитать больше примеров в документе Flutter, связанном с этим ответом.

Ответ №2:

ShowDialog возвращает будущее ваш метод selectPhoto должен быть асинхронным, а ваш код должен быть таким

   Future<void> selectPhoto() async {
    await showDialog(
      context: context,
      builder: (BuildContext context) {
        return SimpleDialog(
          title: const Text('Select assignment'),
          children: <Widget>[
            SimpleDialogOption(...),
            SimpleDialogOption(...),
            SimpleDialogOption(...)
          ],
        );
      },
    );
  }
 

для получения дополнительной информации посетите официальный документ