#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. Попробуйте использовать виджет с ограниченным полем.