#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(...)
],
);
},
);
}
для получения дополнительной информации посетите официальный документ