间距小部件
Flutter 有很多小部件来帮助调整间距 - 在小部件内部,例如Row
或Column
包含子列表的小部件。
前:
Spacer
- 填充其他子小部件之间空间的小部件。
Flexible
- 包装一个小部件并允许您定义一个flex
值以影响该小部件与子列表中的其他小部件相比应占用多少空间。
Expanded
- 如果你在其中包装一个小部件,你会让一个小部件填满剩余的空间。
ConstrainedBox
- 允许为子小部件设置 minWidth、maxWidth、minHeight、maxHeight。
代码示例
鉴于您的要求:
- 有一个单行文本的缩进
- 多行文本没有缩进
SizedBox 是不行的
SizedBox
不适用于多行文本,因为Text
aRow
中的多行必须包含在Flexible
(Flutter - 行内的多行标签)中,并且 SizedBox 将始终占据您设置的任何宽度 - 没有 Spacer、Flexible 或 Expanded 的组合似乎在这里工作。
替代解决方案
一种选择是指定 aRow
并将 mainAxisAlignment 设置为MainAxisAlignment.end
并使用 BoxConstraint 和 MediaQuery 减去我们想要的文本容器的 minWidth 的屏幕宽度。
class IndentedText extends StatelessWidget {
const IndentedText({Key? key, required this.text, this.textMinWidth = 150}) : super(key: key);
final String text;
final double textMinWidth;
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [
Flexible(
child: ConstrainedBox(
constraints: BoxConstraints(minWidth: MediaQuery.of(context).size.width - textMinWidth),
child: Text(text),
),
),
],
);
}
}
然后widget的使用
class SpacingExample extends StatelessWidget {
const SpacingExample({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Card(
child: Column(
children: const [
IndentedText(text: "text"),
IndentedText(
text:
"A vehicle is a object people use to get around more easily, etc etc make the text longer and multiline.",
)
],
),
),
],
);
}
}
它的外观:
- 注意:对于更复杂的用例,当您减去 minWidth - 如果布局有多个列 f.ex. 以及可能的填充大小,您可能还需要减去其他小部件的大小。