Отрегулируйте высоту контейнера на максимальную высоту дочернего элемента в строке

#flutter #layout

#flutter #макет

Вопрос:

введите описание изображения здесь

У меня есть несколько Row элементов. Каждый Row содержит несколько Container элементов. Я хочу Container , чтобы элементы были расширены до текущей высоты Row .

Например: в последнем Row я хочу, чтобы все дочерние элементы имели высоту элемента 87 .

Я много пробовал:

  • Контейнер height для double.infinity
  • Контейнер constraints для BoundContraints.expand()
  • Использование IntrinsicHeight() :

    Внутренняя высота ( дочерний элемент: строка( Выравнивание поперечной оси: выравнивание поперечной оси.растяжение, дочерние элементы: myContainers ) )

Однако все эти подходы приводят к исключениям, поскольку вся высота увеличивается до бесконечности или — в случае IntrinsicHeight возврата подхода

LayoutBuilder не поддерживает возврат внутренних размеров.

Я думаю, это потому, что у меня нет явного набора maxHeight для всего инструмента.

Итак, я хочу сохранить фактическую Row высоту, но хочу расширить ее дочерние элементы.

Заранее спасибо

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

1. и почему бы не использовать simple Stack с Positioned дочерними элементами?

2. @pskink: потому что это приводит к той же проблеме: как я узнаю требуемую высоту априори? Я бы установил фиктивную высоту. Теперь высота строки динамически устанавливается на высоту динамически устанавливаемой высоты дочернего элемента. Я не знаю об окончательной высоте до того, как она не была создана.

3. @pskink размеры шрифта устанавливаются динамически в соответствии с фиксированными размерами контейнера. Они в порядке, как они есть. Но они приводят к разной высоте. Моя цель такова, как описано: сохраните текущую высоту строки, но отрегулируйте для нее высоту дочерних элементов.

Ответ №1:

Вы рассматривали таблицу? Похоже, это правильно.

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

1. о нет! : D Я никогда не знал о виджете таблицы! Я не знаю почему, но это было бы решением!

Ответ №2:

Есть и другие подходы.Вы можете обернуть свою строку контейнером фиксированного размера следующим образом.Width возвращает текущую ширину устройства.

 Container(
  width:MediaQuery.of(context).size.width,
  height:87,
  Row(
    children:[]
  )
)
 

ИЛИ вы можете создать так.Здесь я использовал ширину устройства / 20 в качестве размера контейнера, или вы можете настроить его, используя свою собственную ширину.

 import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: Colors.blue),
        debugShowCheckedModeBanner: false,
        home: Answer());
  }
}

class Answer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          SizedBox(
            height: 10,
          ),
          Row(
            children: [
              SizedBox(width: 10),
              RowItem(
                count: '1',
                txt: "H",
              ),
              Spacer(),
              RowItem(
                count: '2',
                txt: "He",
              ),
              SizedBox(width: 10),
            ],
          ),
          Row(
            children: [
              SizedBox(width: 10),
              RowItem(
                count: '3',
                txt: "Li",
              ),
              RowItem(
                count: '4',
                txt: "Be",
              ),
              Spacer(),
              RowItem(
                count: '5',
                txt: "B",
              ),
              RowItem(
                count: '6',
                txt: "C",
              ),
              RowItem(
                count: '7',
                txt: "N",
              ),
              RowItem(
                count: '8',
                txt: "O",
              ),
              RowItem(
                count: '9',
                txt: "F",
              ),
              RowItem(
                count: '10',
                txt: "Ne",
              ),
              SizedBox(width: 10),
            ],
          ),
          Row(
            children: [
              SizedBox(width: 10),
              RowItem(
                count: '11',
                txt: "Na",
              ),
              RowItem(
                count: '12',
                txt: "Mg",
              ),
              Spacer(),
              RowItem(
                count: '13',
                txt: "Al",
              ),
              RowItem(
                count: '14',
                txt: "Si",
              ),
              RowItem(
                count: '15',
                txt: "P",
              ),
              RowItem(
                count: '16',
                txt: "S",
              ),
              RowItem(
                count: '17',
                txt: "Cl",
              ),
              RowItem(
                count: '18',
                txt: "Ar",
              ),
              SizedBox(width: 10),
            ],
          ),
        ],
      ),
    );
  }
}

class RowItem extends StatelessWidget {
  final String txt;
  final String count;
  RowItem({@required this.txt, @required this.count});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 87,
      width: MediaQuery.of(context).size.width / 20,
      child: Center(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(count),
          SizedBox(
            height: 2,
          ),
          Text(txt)
        ],
      )),
      decoration: BoxDecoration(border: Border.all(color: Colors.blue)),
    );
  }
}
 

проверьте результат здесь.
конечный результат

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

1. Ну, как я вижу, для этого необходимо знать о высоте строки перед вычислением, правильно? В моем примере это невозможно. Я даже не знаю, какой будет высота. Я просто хочу сохранить текущую высоту строки такой, какая она есть, и хотел бы настроить на нее всех дочерних элементов.

2. No.in в моем коде строка не зависит от высоты. единственное, что нужно, это высота контейнера. Это будет зависеть от высоты дочернего контейнера. вы можете изменить его размер, добавив к нему переменную. затем вы можете назначить баллы этому контейнеру при создании

3. Вы пробовали изменять конфигурацию с помощью расширенного виджета

4. Расширенный не будет работать, поскольку он будет использовать бесконечную высоту.

5. Попробуйте использовать виджет с ограниченным полем.