Как стилизовать действия AlertDialog во Flutter
Я использую этот метод, чтобы показать AlertDialog:
_onSubmit(message) {
if (message.isNotEmpty) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Center(child: Text('Alert')),
content: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children : <Widget>[
Expanded(
child: Text(
message,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.red,
),
),
)
],
),
actions: <Widget>[
FlatButton(
child: Text('Cancel'),
onPressed: () {
Navigator.of(context).pop();
}),
FlatButton(
child: Text('Ok'),
onPressed: () {
_inputTextController.clear();
Navigator.of(context).pop();
})
],
);
},
);
}
}
Все работает, но кнопки выровнены по правому краю, как показано на рисунке ниже:
Я хочу, чтобы стиль, как кнопки, например, один на начало, другой на конец. Я искал в документах, но только нашел, как сделать их "С накоплением полноразмерных кнопок". Любые идеи, как стиль кнопок?
7 ответов
Настроить виджет
Отредактируйте сам виджет: под AlertDialog
есть виджет ButtonBar, где вы можете использовать alignment: MainAxisAlignment.spaceBetween
правильно выровнять кнопки. Посмотрите этот ответ для примера пользовательского виджета AlertDialog.
Собственный ряд кнопок
Вы также можете удалить кнопки под actions
и добавить собственный кастом Row
с RaisedButtons в нем, как-то так:
Row (
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
RaisedButton(), // button 1
RaisedButton(), // button 2
]
)
В вашем случае вы можете добавить столбец вокруг строки в content
и там добавьте существующую строку и модифицированную, которую вы создали из приведенного выше примера.
Переместить кнопки в контент - это хорошее решение.
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Center(child: Text('Alert')),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
child: Text(
"message",
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.red,
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
FlatButton(
child: Text('Yes'),
onPressed: () {
Navigator.of(context).pop();
}),
FlatButton(
child: Text('No'),
onPressed: () {
Navigator.of(context).pop();
})
])
],
),
);
});
Смена темы - хороший вариант.
MaterialApp(
theme: ThemeData(
buttonBarTheme: ButtonBarThemeData(
alignment: MainAxisAlignment.center,
)),
...
Я использую этот метод для выравнивания кнопок в действиях AlertDialog.
Стиль AlertDialog:
AlertDialog (название: Ряд ( mainAxisAlignment: MainAxisAlignment.spaceBetween, дети: [ Текст ('Tilte'), CloseButton(цвет: Цвет (0xFFD5D3D3), onPressed: () { Navigator.of(контекст).pop(); }) ]), содержимое: SingleChildScrollView(дочерний элемент: Text("Boby")), действия: [ SizedBox( width: MediaQuery.of(контекст).size.width, ребенок: Строка ( mainAxisAlignment: MainAxisAlignment.center, дети: [ ButtonTheme( minWidth: 25.0, высота: 25,0, дочерний элемент: OutlineButton( borderSide: BorderSide(цвет: Colors.blueAccent), ребенок: новый текст ("Сохранить"), форма: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20)), onPressed: () {})), SizedBox(ширина: 8,0), ButtonTheme( minWidth: 25.0, высота: 25,0, дочерний элемент: OutlineButton( borderSide: BorderSide(цвет: Colors.black26), textColor: Colors.blue, ребенок: новый текст ("Закрыть"), форма: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20)), onPressed: () {})) ])) ]);
Не добавляйте кнопку в действия AlertDialog. Как вы видете.
_onSubmit(message) {
if (message.isNotEmpty) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Center(child: Text('Alert')),
content: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children : <Widget>[
Expanded(
child: Text(
message,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.red,
),
),
),
FlatButton(
child: Text('Cancel'),
onPressed: () {
Navigator.of(context).pop();
}),
FlatButton(
child: Text('Ok'),
onPressed: () {
_inputTextController.clear();
Navigator.of(context).pop();
})
],
),
);
},
);
}
}
Вот простой ответ на вашу проблему: просто используйте свойство actionAlignment класса AlertDialog во флаттере. Вот так
AlertDialog(
actions: ...,
actionsAlignment: MainAxisAlignment.spaceBetween
)
Или вы можете использовать библиотеку RFlutter Alert для этого. Это легко настраиваемый и простой в использовании. Его стиль по умолчанию включает в себя закругленные углы, и вы можете добавлять кнопки сколько угодно.
Стиль оповещения:
var alertStyle = AlertStyle(
animationType: AnimationType.fromTop,
isCloseButton: false,
isOverlayTapDismiss: false,
descStyle: TextStyle(fontWeight: FontWeight.bold),
animationDuration: Duration(milliseconds: 400),
alertBorder: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(0.0),
side: BorderSide(
color: Colors.grey,
),
),
titleStyle: TextStyle(
color: Colors.red,
),
);
И добавление вашего объекта Alert Style в поле стиля Alert.
Alert(
context: context,
style: alertStyle,
type: AlertType.info,
title: "RFLUTTER ALERT",
desc: "Flutter is more awesome with RFlutter Alert.",
buttons: [
DialogButton(
child: Text(
"COOL",
style: TextStyle(color: Colors.white, fontSize: 20),
),
onPressed: () => Navigator.pop(context),
color: Color.fromRGBO(0, 179, 134, 1.0),
radius: BorderRadius.circular(0.0),
),
],
).show();
* Я один из разработчиков RFlutter Alert.