Можно ли передать класс в качестве параметра в функции, которую я трепещу?
Здесь у меня есть служебный класс, в котором у меня есть функция для отображения DialogBox, поэтому я пытаюсь создать AlertDailog Box, который можно использовать где угодно во всем проекте. Итак, у меня есть заголовок, описание в качестве аргумента, а также я хочу передать имя класса, чтобы при нажатии кнопки в диалоговом окне предупреждения мы могли перейти к этому экрану.
class DialogBox {
static DialogBox dialogBox = null;
static DialogBox getInstance() {
if (dialogBox == null) {
dialogBox = DialogBox();
}
return dialogBox;
}
showAlertDialog(BuildContext context, String alertTitle, String alertMessage) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
title: Center(child: Text(alertTitle)),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
alertMessage,
textAlign: TextAlign.center,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
FlatButton(
child: Center(
child: Text(
'Ok',
textAlign: TextAlign.center,
)),
onPressed: () {
Navigator.of(context).pop();
// Navigator.of(context).push(MaterialPageRoute(
// builder: (BuildContext context) {
// return Home();//Intead of giving Home() anything can be passed here
// }));
},
),
])
],
),
);
});
}
}
Прямо сейчас я просто закрыл диалоговое окно, но там я хочу перейти к другому классу
1 ответ
Решение
Передача имени класса - плохая идея - классу могут потребоваться параметры для конструктора, он небезопасен по типу и требует отражения, которое Flutter не поддерживает.
Вместо этого вы можете передать функцию, которая создаст виджет нужного типа:
showAlertDialog(
BuildContext context,
String alertTitle,
String alertMessage,
Widget Function() createPage,
) {
// ...
onPressed: () {
Navigator.of(context).pop();
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) {
return createPage();
}));
},
// ...
}
и назовите его, например, так:
showAlertDialog(context, title, message, () => Home())