У меня есть домашний экран с FAB, и когда он нажимается, я хочу отобразить диалог для ввода пользователем.

В настоящее время я использую showDialog() с SimpleDialog.

showDialog(
          context: context,
          builder: (BuildContext context) {
            return SimpleDialog(
              title: NormalText('New Counter Item'),
              contentPadding: EdgeInsets.fromLTRB(24.0, 0.0, 24.0, 24.0),
              children: <Widget>[
                Container(
                  ...
                )
              ],
            );
          });

Но я не могу настроить что-либо с ним (меньше, изогнутое в углу и расположенное ниже на экране). AlertDialog похоже тоже самое.

Есть ли способ настроить эти атрибуты?

5
Danopie 20 Авг 2018 в 14:43

6 ответов

Лучший ответ

Нет. Они не предназначены для настройки. Они были сделаны с учетом принципов дизайна материалов.

Если вам нужен индивидуальный дизайн, вы можете создать свой собственный мод, основанный на {{X0 }} и / или DecoratedBox

0
Rémi Rousselet 20 Авг 2018 в 12:18

SimpleDialog и AlertDialog предназначены для удовлетворения определенного набора потребностей. У них есть определенные уровни настройки, но в конечном итоге они предназначены просто для показа простых всплывающих диалогов, которые дают пользователю некоторую информацию и запрашивают ответ диалога (например, «Да», «Нет», «Отмена», «Сохранить», так далее.).

Если вы хотите иметь более настраиваемый всплывающий диалог, вам нужно создать свой собственный. С другой стороны, все довольно просто. Пусть конструктор в showDialog вернет виджет Dialog с дочерним элементом, для которого установлено все, что вы хотите:

showDialog(
  context: context,
  builder: (BuildContext cxt) {
    return Dialog(
      child: Container(
        ...
      ),
    );
  },
);

Очевидно, вам нужно будет воссоздать такие вещи, как строка заголовка и панель действий, но вы можете либо взломать исходный код SimpleDialog и AlertDialog и скопировать то, что у них там, или вы можете свернуть свой собственный решение.

4
Abion47 15 Июл 2019 в 17:06

Это не так страшно, как вы могли ожидать. Вам нужно только клонировать Dialog.dart и заменить виджет Центр на Align.

Конечно, также переименовать вещи; например MyDialog, myShowDialog, MySimpleDialog.

Ага, это так просто.

И если вы в движении, как насчет добавления параметра выравнивания виджета Align в качестве дополнительного ...

2
Ian White 8 Апр 2019 в 03:07
return showDialog<void>(
      barrierDismissible: true,
      context: context,
      builder: (BuildContext context) {
        return new Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.all(0),
              child: new Container(
                height: 100,
                width: MediaQuery.of(context).size.width,
                color: Colors.purple,
                child: new Column(
                  children: <Widget>[
                    new Text(
                      'custom dialog text',
                      style: new TextStyle(
                        fontSize: 14,
                        color: Colors.white,
                      ),
                    ),
                  ],
                ),
              ),
            )
          ],
        );
      },
    );

Надеюсь, это поможет, спасибо

2
Rami Ibrahim 5 Авг 2019 в 19:05

Вы можете скопировать и изменить код AlertDialog чтобы создать свой собственный.

0
boformer 20 Авг 2018 в 11:56

Вот чистое решение: если по какой-то причине у вас есть TextField / TextFormField, и там у вас есть свойство onsubmit, вы можете выполнить следующее:

onSubmit: () {                   
    showDialog(
      context: context,
      builder: (context){
        return WillPopScope(
          onWillPop: () { return Future(() => false); }, // this will prevent going back 
          child: AlertDialog(
            content: Row(
              children: [
                progressWidget(),
                Container(margin: EdgeInsets.only(left: 10.0),child:Text("Loading" )),
              ],),
          )
        );
      }
    );

    yourCallToMethod.whenComplete((){
      Navigator.of(context).pop();
    });
},

< Сильный > ПОЛЬЗА ?

Когда отображается showAlert, если кто-то случайно или агрессивно нажимает на экран, экран возвращается назад. Это предотвращает такое поведение и закрывает showAlert только после завершения вашей функции.

-1
MR_AMDEV 10 Апр 2020 в 17:14
51930040