Флаттер: ошибка с РАСШИРЕННЫМ, хотя уже обернутым СТОЛБЦОМ

#flutter #dart #widget

#флаттер #дротик #виджет

Вопрос:

Я просто хотел создать несколько текстовых меток на основе списка и вывести их в ячейку расширяемого столбца. Хорошо, сегодня я узнал, что мне нужно поместить EXPANDED впереди и, кроме того, что EXPANDED необходимо обернуть с помощью FLEX, ROW или COLUMN.

Но я продолжаю получать ошибку, которая

  The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a
RenderObject, which has been set up to accept ParentData of incompatible type BoxParentData.
Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically,
Expanded widgets are placed directly inside Flex widgets.
The offending Expanded is currently placed inside an Align widget.
The ownership chain for the RenderObject that received the incompatible parent data was:
  _ScrollSemantics-[GlobalKey#05460] ← Scrollable ← PrimaryScrollController ← SingleChildScrollView
← Expanded ← Align ← Padding ← DecoratedBox ← Padding ← Container ← ⋯
  
 child: Column(
  children: <Widget>[
    CupertinoButton(
      child: Text('expand', style: TextStyle(color: CupertinoColors.activeBlue)),
      onPressed: () {
        setState(() {
          step1Expanded = !step1Expanded;
        );
      },
    ), //Button
    Container(
      child: Column(
        children: <Widget>[
          Expanded(
            flex: 1,
            child: (step1Expanded)? step1RowWidget(taskPrmtrs) : Container()
          ),
        ] //Widget
      ),
    ), //Container
  ],
),

Widget step1RowWidget(List<Parameter> parameters)  {
  TextEditingController name;
   Row(
      children: <Widget>[
        Text("Hallo"),
        Column(
          children: <Widget>[
              for (var parameter in parameters) Text(parameter.descr)
            ],
          ),
        Column(
          children: <Widget>[
            for (var parameter in parameters) Text(parameter.descr)
//            for (var parameter in parameters) _createTextField()
          ],
        ),
  ],
  );
}

Widget _createTextField() {
  TextEditingController name;
  CupertinoTextField(
    controller: name,
    decoration: BoxDecoration(
      ),
    placeholder: "Wert",
    );
}
  

Ошибка возникает немного выше середины фрагмента в строке с расширенным. В чем еще может быть проблема?

ОБНОВЛЕНИЕ: С добавлением 2 РАСШИРЕННЫХ строк я исправил проблему (на основе ответов ниже). Мне также понадобился верхний РАСШИРЕННЫЙ (КОНТЕЙНЕР(, чтобы исправить это. Однако, когда открывается экран, второй внешний КОНТЕЙНЕР самого внешнего СТОЛБЦА теперь заполняет экран до самого низа (тот, который охватывает столбец кнопки и внутренний динамический столбец). Ожидаемое поведение: родительский КОНТЕЙНЕР для CUPERTINOBUTTON должен плотно обтекать КНОПКУ (на основе полей / отступов), и это не должно создавать пустое пространство в нижней части экрана. Я думаю, это вызвано РАСШИРЕННЫМ

   navigationBar: CupertinoNavigationBar(
      middle: Text('Header'),
    ),
    child: SafeArea(
      child: Column(
        children: <Widget>[
          Container(
            alignment: Alignment.center,
            margin: new EdgeInsets.all(10.0),
            padding: new EdgeInsets.all(10.0),
            child: new Expanded(
              flex: 1,
              child: new SingleChildScrollView(
                scrollDirection: Axis.vertical,//.horizontal
                child: Text(fillParamGeneric(taskText, taskPrmtrs)),
              ),
            ),
          ),
          Expanded ( // ADDED according to answers here
            child: Container( // ADDED "child:"
              alignment: Alignment.center,
              margin: new EdgeInsets.all(10.0),
              padding: new EdgeInsets.all(10.0),
              child: Column(
                children: <Widget>[
                  CupertinoButton(
                    child: Text('expand', style: TextStyle(color: CupertinoColors.activeBlue)),
                    onPressed: () {
                      setState(() {
                        step1Expanded = !step1Expanded;
                      });
                    },
                  ),
                  Expanded( // ADDED according to answers here
                    child: Column(
                        children: <Widget>[
                          (step1Expanded)? step1RowWidget(taskPrmtrs) : Container(width: 0.0, height: 0.0)
                        ]
                    ),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    ),
  );
}
  

Ответ №1:

Что вы можете сделать, это просто отключить Container виджет и вместо этого использовать Expanded виджет. Таким образом, это займет все оставшееся пространство из внешнего столбца. Column Виджет не налагает никаких ограничений на своих дочерних элементов, поэтому, поскольку вы не задали контейнеру никаких размеров или ограничений, то по умолчанию он будет стараться быть настолько большим, насколько это возможно.

Комментарии:

1. Большой скачок вперед. Спасибо! Но, похоже, теперь expanded расширяет мой контейнер (который мне нужен для цвета фона) до нижней части экрана. Я обновил ответ исправленным кодом. Как мне получить конец контейнера с помощью кнопки или с расширенным разделом, когда он расширен?

2. Вы можете просто удалить расширенный и придать контейнеру его собственную высоту.

3. Да, но это было бы нечетко, потому что размер динамический. Нет ли чистого подхода к созданию контейнера (столбец (a, b)), где b может быть либо пустым контейнером, либо другим столбцом с различным количеством элементов, для которых контейнер всегда обтекается определенным заполнением вокруг столбца?

4. Тем не менее, отключите расширенный, тот, который оборачивает контейнер, но на этот раз также удалите второй расширенный, который находится под кнопкой. Теперь контейнер должен изменять свой размер в соответствии с размером имеющихся в нем элементов.

5. вы имеете в виду удалить оба РАСШИРЕННЫХ, которые ДОБАВИЛИ … в качестве комментария. Именно с этого я и начал свою проблему 🙂

Ответ №2:

Проблема в том, что у вас есть column внутри вашего column .

И поскольку столбцы занимают бесконечную высоту. Это выдает ошибку переполнения потока.

Что вы можете сделать, так это обернуть column внутри container с помощью Expanded .

Комментарии:

1. Большой скачок вперед. Спасибо! Но, похоже, теперь expanded расширяет мой контейнер (который мне нужен для цвета фона) до нижней части экрана. Я обновил ответ исправленным кодом. Как мне получить конец контейнера с помощью кнопки или с расширенным разделом, когда он расширен?