在Android中,match_parent和wrap_content用于自动调整小部件相对于其父部件所包含内容的大小。
在Flutter中,似乎默认所有小部件都设置为wrap_content,我如何改变它,以便我可以填充它的宽度和高度,以它的父?
在Android中,match_parent和wrap_content用于自动调整小部件相对于其父部件所包含内容的大小。
在Flutter中,似乎默认所有小部件都设置为wrap_content,我如何改变它,以便我可以填充它的宽度和高度,以它的父?
当前回答
在列中使用这行代码。 对于wrap_content: mainAxisSize: mainaxisize .min 对于match_parent: mainAxisSize: mainaxisize .max
其他回答
使用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
为了获得match_parent和wrap_content的行为,我们需要 在行/列小部件中使用mainAxisSize属性,即mainAxisSize 属性取MainAxisSize枚举,有两个值,即 MainAxisSize。min,表现为wrap_content和mainaxisize .max 它的行为类似于match_parent。
原文链接
使用小部件Wrap。
对于类似列的行为尝试:
return Wrap(
direction: Axis.vertical,
spacing: 10,
children: <Widget>[...],);
对于Row类行为尝试:
return Wrap(
direction: Axis.horizontal,
spacing: 10,
children: <Widget>[...],);
有关更多信息:Wrap (Flutter小部件)
要让一个子填充它的父,只需将它包装到FittedBox中
FittedBox(
child: Image.asset('foo.png'),
fit: BoxFit.fill,
)
匹配父
为了匹配或填充父对象(高度和宽度),我们可以在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);
},
),
);
}
}