修复需要在 Flutter 中扩展的 Widget 的最小宽度
Fix minimum width to a Widget which needs to expand in Flutter
我需要为我的列小部件设置最小宽度。在它们每个内部,我都有文本小部件,它们可以很短也可以很长。我需要为它们固定一个最小宽度,以便即使文本很短也能获得可接受的 Column 大小。其他专栏显然需要自己适应。
Row(children: [
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 80), // do not work
child: Text("short text"),
),
],
),
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 110), // do not work
child: RichText(
text: TextSpan(
text:"very very longggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg text")),
),
],
),
],
)
使用 FittedBox();
假设示例:
Row(
children: [
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 80), // do not work
child: Text("short text"),
),
],
),
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 110), // do not work
child:
FittedBox(
child: RichText(
text: TextSpan(
text:
"very very longggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg text")),
),
),
],
),
],
);
可能有十几种方法可以满足您的需求。并且可能 none 其中直接或易于理解。 (约束和大小的主题相当复杂。请参阅 this constraints page for more examples & explanations。)
这是一种可能的解决方案。
这将设置蓝色列的最小宽度(基于 stepWidth
),但如果里面的文本 (child) 需要,则会 expand/grow。
黄色列将调整大小以适应蓝色列。
class ExpandedRowPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Expanded Row Page'),
),
body: SafeArea(
child: Center(
child: Row(
children: [
IntrinsicWidth(
stepWidth: 100,
// BLUE Column
child: Container(
color: Colors.lightBlueAccent,
child: Column(
children: [
//Text('Short'),
Text('shrt')
],
)
),
),
// YELLOW Column
Flexible(
child: Container(
alignment: Alignment.center,
color: Colors.yellow,
child: Column(
children: [
Text('Very lonnnnnnnnnnnnnnnnnnnnnnnnnnnng texttttttttttttt'),
],
)
),
)
],
)
),
),
);
}
}
您可以在没有 Flexible
黄色列的情况下执行上述操作,但是很长的文本 child 会在没有 Flexible 或 Expanded wrapping 小部件的情况下导致溢出警告。
行小部件本身具有无限宽度限制。因此,如果 child 想要大于屏幕宽度,它可以并且会导致溢出。 (尝试删除上面的 Flexible
并重建以查看。)
Flexible and Expanded,仅在 Row & Column(或 Flex,它们的超类)内部使用,检查屏幕宽度和 Row 内的其他小部件,并为其 children 提供定义的约束大小而不是无限大小. Children(在 Flexible/Expanded 内)现在可以查找 parent 的约束并相应地调整自己的大小。
例如,当文本小部件对于 Flexible/Expanded 给定的约束来说太宽时,将换行其文本。
我需要为我的列小部件设置最小宽度。在它们每个内部,我都有文本小部件,它们可以很短也可以很长。我需要为它们固定一个最小宽度,以便即使文本很短也能获得可接受的 Column 大小。其他专栏显然需要自己适应。
Row(children: [
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 80), // do not work
child: Text("short text"),
),
],
),
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 110), // do not work
child: RichText(
text: TextSpan(
text:"very very longggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg text")),
),
],
),
],
)
使用 FittedBox();
假设示例:
Row(
children: [
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 80), // do not work
child: Text("short text"),
),
],
),
Column(
children: [
Container(
constraints: BoxConstraints(minWidth: 110), // do not work
child:
FittedBox(
child: RichText(
text: TextSpan(
text:
"very very longggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg text")),
),
),
],
),
],
);
可能有十几种方法可以满足您的需求。并且可能 none 其中直接或易于理解。 (约束和大小的主题相当复杂。请参阅 this constraints page for more examples & explanations。)
这是一种可能的解决方案。
这将设置蓝色列的最小宽度(基于 stepWidth
),但如果里面的文本 (child) 需要,则会 expand/grow。
黄色列将调整大小以适应蓝色列。
class ExpandedRowPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Expanded Row Page'),
),
body: SafeArea(
child: Center(
child: Row(
children: [
IntrinsicWidth(
stepWidth: 100,
// BLUE Column
child: Container(
color: Colors.lightBlueAccent,
child: Column(
children: [
//Text('Short'),
Text('shrt')
],
)
),
),
// YELLOW Column
Flexible(
child: Container(
alignment: Alignment.center,
color: Colors.yellow,
child: Column(
children: [
Text('Very lonnnnnnnnnnnnnnnnnnnnnnnnnnnng texttttttttttttt'),
],
)
),
)
],
)
),
),
);
}
}
您可以在没有 Flexible
黄色列的情况下执行上述操作,但是很长的文本 child 会在没有 Flexible 或 Expanded wrapping 小部件的情况下导致溢出警告。
行小部件本身具有无限宽度限制。因此,如果 child 想要大于屏幕宽度,它可以并且会导致溢出。 (尝试删除上面的 Flexible
并重建以查看。)
Flexible and Expanded,仅在 Row & Column(或 Flex,它们的超类)内部使用,检查屏幕宽度和 Row 内的其他小部件,并为其 children 提供定义的约束大小而不是无限大小. Children(在 Flexible/Expanded 内)现在可以查找 parent 的约束并相应地调整自己的大小。
例如,当文本小部件对于 Flexible/Expanded 给定的约束来说太宽时,将换行其文本。