在Android中,match_parent和wrap_content用于自动调整小部件相对于其父部件所包含内容的大小。
在Flutter中,似乎默认所有小部件都设置为wrap_content,我如何改变它,以便我可以填充它的宽度和高度,以它的父?
在Android中,match_parent和wrap_content用于自动调整小部件相对于其父部件所包含内容的大小。
在Flutter中,似乎默认所有小部件都设置为wrap_content,我如何改变它,以便我可以填充它的宽度和高度,以它的父?
当前回答
匹配父
为了匹配或填充父对象(高度和宽度),我们可以在Container上使用额外的约束:
Container(
constraints: BoxConstraints.expand(), // ← this guy
child: Text('Center > Container > Text')
)
在Flutter中,约束是可以填充的空间(如果约束“严格”,则必须填充)。
约束条件是…不,实际上是父母强加的。
默认情况下,Container将把它的内容(child:)和大小本身包装到它的子元素中,除非被重写(或被严格的约束不允许)。
使用constraints:参数,我们可以给Container额外的约束来覆盖默认的Container约束行为(比如包装内容)。
使用Container(constraints: BoxConstraints.something)不会覆盖传入/父约束;它只是允许我们在允许的情况下重写默认行为,比如包装内容。
代码示例- BoxConstraints
下面是一个复制/粘贴代码示例,展示了我们可以应用到具有“松散”传入/父约束(由Center提供)的容器上的各种约束的效果。
import 'package:flutter/material.dart';
class MatchParentPage extends StatefulWidget {
@override
_MatchParentPageState createState() => _MatchParentPageState();
}
class _MatchParentPageState extends State<MatchParentPage> {
BoxConstraints constraints;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Match Parent'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Expanded( // shares space constraint evenly with other Expanded
child: Center( // ← fills tight parent constraint & loosens ↓ child constraint ↓
child: Container( // got loose constraint from Center...
constraints: constraints, // can apply many additional constraints
color: Colors.lightBlueAccent.withOpacity(.3),
child: Text('Center > Container > Text')),
),
),
Expanded(
child: Container(
color: Colors.orangeAccent,
child: Wrap(
children: [
_button('default', null),
_button('*expand()', BoxConstraints.expand()),
_button('*tight(Size.infinite)', BoxConstraints.tight(Size.infinite)),
_button('tight(Size.zero)', BoxConstraints.tight(Size.zero)),
_button('tight(Size.fromHeight(100))', BoxConstraints.tight(Size.fromHeight(100))),
_button('tight(Size.fromWidth(100))', BoxConstraints.tight(Size.fromWidth(100))),
_button('tightForFinite(width: 100, height: 100)', BoxConstraints.tightForFinite(width: 100, height: 100)),
_button('loose(Size.infinite)', BoxConstraints.loose(Size.infinite)),
_button('tightFor(width: double.infinity)', BoxConstraints.tightFor(width: double.infinity)),
_button('tightFor(height: double.infinity)', BoxConstraints.tightFor(height: double.infinity)),
])
),
)
],
),
);
}
Widget _button(String label, BoxConstraints _constraints) {
bool _active = _constraints == constraints;
return Padding(
padding: const EdgeInsets.only(top:8, left: 8),
child: RaisedButton(
color: _active ? Colors.cyanAccent : null,
child: Text(label),
onPressed: () {
setState(() => constraints = _constraints);
},
),
);
}
}
其他回答
对于匹配父选项,你可以用容器包装小部件,并给它一个这样的宽度
宽度:double.infinity
这种方法将使小部件填充屏幕上的最大可用空间。
使用FractionallySizedBox小部件。
FractionallySizedBox(
widthFactor: 1.0, // width w.r.t to parent
heightFactor: 1.0, // height w.r.t to parent
child: *Your Child Here*
}
当您希望将子节点的大小调整为其父节点大小的一小部分时,这个小部件也非常有用。
例子: 如果你想让子元素占据父元素50%的宽度,将widthFactor设置为0.5
要让一个子填充它的父,只需将它包装到FittedBox中
FittedBox(
child: Image.asset('foo.png'),
fit: BoxFit.fill,
)
一个简单的解决方法:
如果容器只有一个顶级子容器,则可以为该子容器指定对齐属性并为其赋值。它会填满容器里的所有空间。
Container(color:Colors.white,height:200.0,width:200.0,
child:Container(
color: Colors.yellow,
alignment:Alignment.[any_available_option] // make the yellow child match the parent size
)
)
另一种方法:
Container(color:Colors.white,height:200.0,width:200.0,
child:Container(
color: Colors.yellow,
constraints: BoxConstraints.expand(height: 100.0), // height will be 100 dip and width will be match parent
)
)
在列中使用这行代码。 对于wrap_content: mainAxisSize: mainaxisize .min 对于match_parent: mainAxisSize: mainaxisize .max