Как добавить поля в мой виджет? Понимание эффекта EdgeInsets

Я пытаюсь обернуть голову вокруг размещения пользовательского интерфейса во Флаттере. Так что у меня сейчас есть что-то похожее на это enter image description here

Я хотел бы добавить немного места для ч/б поиска по текстовому полю и кнопке. Вот как выглядит управляющая часть моего кода. Я пытаюсь стилизовать свой textFieldSearchBox, чтобы он имел небольшое поле справа, я пытался увеличить Edge вставки, но, похоже, он увеличивает размер TextField, я не знаю почему? Я знаю, что мог бы добавить элемент отступа после TextField, но я хотел знать, какие у меня есть другие варианты. Почему увеличение EdgeInsets в оформлении textFieldSearchBox увеличивает размер текстового поля? Моя идеальная ситуация - добавить поля вокруг всех границ этого текстового поля (LTRB). Есть предложения?

TextField textFieldSearchBox = new TextField(
            keyboardType: TextInputType.text,
            controller: filterController,
            autofocus: false,
            decoration: new InputDecoration(
                contentPadding: new EdgeInsets.fromLTRB(20.0, 10.0, 100.0, 10.0),
                border:
                new OutlineInputBorder(borderRadius: BorderRadius.only()),
            ),
        );

    var optionRow = new Row(
            children: <Widget>[
                new Expanded(child:textFieldSearchBox),
                searchButton,
                new IconButton(
                    icon: new Icon(Icons.filter),
                    onPressed: (){print("Called....");},
                ),
            ],
        );

    return new Scaffold(
                appBar: new AppBar(
                    title: new Text("Title goes here.."),
                    backgroundColor: Colors.lightBlueAccent,
                ),
                body: new Container(
                    child:new Column(
                        children: <Widget>[
                            optionRow,

                        ],
                    ),
                ),
        );

Ответ 1

Это более обобщенный ответ для будущих читателей.

Как добавить поля в виджет

Во Flutter мы обычно говорим о добавлении Padding вокруг виджета, а не на полях. Виджет "Контейнер" действительно имеет параметр margin, но даже это просто оборачивает его дочерним (и любым украшением, которое имеет дочерний элемент) внутренний виджет Padding.

Так что если у вас есть что-то вроде этого

enter image description here

и вы хотите добавить пространство вокруг виджета, как этот

enter image description here

тогда вы просто оберните виджет с помощью Padding. Это легко сделать, если навести курсор на имя виджета и нажать Alt + Enter (или Option + Return на Mac) в Android Studio. Затем выберите Добавить отступы из меню.

enter image description here

что дает вам что-то вроде этого

Padding(
  padding: const EdgeInsets.all(8.0),
  child: Text(
      "text",
      style: TextStyle(fontSize: 20.0),
    ),
);

Значение EdgeInsets

Когда вы устанавливаете отступы, вы не можете напрямую использовать целое или двойное число. Вы должны указать пространство (количество логических пикселей), используя EdgeInsets. Вы можете установить все стороны одновременно (как мы видели в примере выше), или вы можете установить их по отдельности, например так:

Widget myWidget() {
  return  Padding(
    padding: const EdgeInsets.only(
      left: 40,
      top: 20,
      right: 40,
      bottom: 20,
    ),
    child: Text("text"),
  );
}

Поскольку в этом примере left и right одинаковы, а top и bottom одинаковы, мы можем упростить EdgeInsets до

padding: const EdgeInsets.symmetric(
  horizontal: 40,
  vertical: 20,
),

Использование контейнера для установки отступов и полей

Альтернативный метод - обернуть ваш виджет в контейнер. Виджет "Контейнер" имеет свойство padding и margin. (Однако это будет необходимо только в том случае, если вы добавляете украшение, например, цвет фона или рамку.)

Widget myWidget() {
  return Container(
    margin: EdgeInsets.all(30),
    padding: EdgeInsets.all(20),
    decoration: BoxDecoration(
        color: Colors.yellow,
        border: Border.all(color: Colors.black),
    ),
    child: Text(
      "Flutter",
      style: TextStyle(
          fontSize: 50.0
      ),
    ),
  );
}

enter image description here

Ответ 2

Почему увеличение EdgeInsets в оформлении textFieldSearchBox увеличивает размер текстового поля?

Поскольку это дополнение используется для внутренней прокладки. Тот, который вы видите между границами и фактическим текстом.

Моей идеальной ситуацией было бы добавление поля по всем границам этого текстового поля (LTRB). Какие-либо предложения?

Оберните свой TextField в Padding. Это идеальный способ достижения желаемого макета во флаттерах.

final textFieldSearchBox = new Padding(
  padding: const EdgeInsets.only(right: 8.0),
  child: new TextField(
    keyboardType: TextInputType.text,
    controller: filterController,
    autofocus: false,
    decoration: new InputDecoration(
      contentPadding: new EdgeInsets.fromLTRB(20.0, 10.0, 100.0, 10.0),
      border: new OutlineInputBorder(borderRadius: BorderRadius.only()),
    ),
  ),
);

Ответ 3

Вы можете поместить компонент в дополнение, например

var optionRow = new Row(
            children: <Widget>[
                new Expanded(child:textFieldSearchBox),
                new Padding(padding: new EdgeInsets.all(20.0),child:button,),
                new IconButton(
                    icon: new Icon(Icons.filter),
                    onPressed: (){print("Called....");},
                ),
            ],
        );

Ответ 4

Поскольку расположение ваших виджетов - это Row, почему бы вам не добавить свойство mainAxisAlignment так:

mainAxisAlignment : MainAxisAlignment.spaceAround

Или же

mainAxisAlignment : MainAxisAlignment.spaceBetween

Ответ 5

Просто используйте

EdgeInsets.fromLTRB

Например:

padding: EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 10.0),