Flutter Flatter中包裹内容和匹配父项的等效项?

Flutter Flatter中包裹内容和匹配父项的等效项?,flutter,Flutter,在Android中,match_parent和wrap_content用于根据小部件包含的内容自动调整小部件相对于其父部件的大小 在Flatter中,默认情况下似乎所有小部件都设置为wrap_content,我如何更改它,以便将其宽度和高度填充为其父小部件的宽度?简短的回答是,在子小部件有尺寸之前,父小部件没有尺寸 Flatter中布局的工作方式是,每个小部件都为其每个子部件提供约束,例如“您可以达到这个宽度,您必须达到这个高度,您必须至少达到这个宽度”,或者其他任何形式(具体来说,它们获得最小

在Android中,
match_parent
wrap_content
用于根据小部件包含的内容自动调整小部件相对于其父部件的大小


在Flatter中,默认情况下似乎所有小部件都设置为
wrap_content
,我如何更改它,以便将其
宽度
高度
填充为其父小部件的宽度?

简短的回答是,在子小部件有尺寸之前,父小部件没有尺寸

Flatter中布局的工作方式是,每个小部件都为其每个子部件提供约束,例如“您可以达到这个宽度,您必须达到这个高度,您必须至少达到这个宽度”,或者其他任何形式(具体来说,它们获得最小宽度、最大宽度、最小高度和最大高度)。每个孩子接受这些约束,做一些事情,并选择一个与这些约束匹配的大小(宽度和高度)。然后,一旦每个孩子完成了自己的事情,小部件就可以选择自己的大小

一些小部件试图在父部件允许的范围内变大。一些小部件试图尽可能地小。一些小部件试图匹配特定的“自然”大小(例如文本、图像)


一些小部件告诉他们的孩子,他们可以任意大小。有些人给孩子的约束条件与他们从父母那里得到的相同。

实际上有一些选项可用:

您可以使用SizedBox.expand使小部件与父维度匹配,或使用SizedBox(宽度:double.infinity)仅与宽度匹配,或使用SizedBox(高度:double.infinity)仅与高度匹配

如果您想要一个wrap_内容行为,它取决于您正在使用的父小部件,例如,如果您在列上放置一个按钮,它的行为将类似于wrap_内容,而要像match_parent一样使用它,您可以使用一个扩展的小部件或一个大小的框来包装该按钮

使用ListView按钮可以获得匹配的父行为,要获得换行内容行为,可以使用类似Row的Flex小部件进行换行

使用扩展小部件生成行、列或Flex的子项 展开以填充主轴中的可用空间(例如,水平方向为 一行或一列的垂直方向)。

使用Flexible小部件,行、列或Flexible的子级可以灵活扩展以填充主轴中的可用空间(例如,水平方向为行或垂直方向为列),但与扩展不同,Flexible不要求子级填充可用空间。
一个简单的解决方法:

 //use this as child
 Wrap(
  children: <Widget>[*your_child*])
 //use this as child
Container(
        height: double.infinity,
    width: double.infinity,child:*your_child*)
 //use this as child
Row(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[*your_child*],
);
 //use this as child
Column(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[your_child],
);
如果容器只有一个顶级子容器,则可以为该子容器指定对齐特性并为其指定任何可用值。它将填满容器中的所有空间

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
   )
)
为了获得match\u parent和wrap\u内容的行为,我们需要 在行/列小部件中使用mainAxisSize属性,即mainAxisSize 属性采用具有两个值的MainAxisSizeenum,这两个值是 MainAxisSize.min作为包裹内容和MainAxisSize.max 其行为与匹配父项相同


原始文章的

在列中使用这行代码。 对于包裹内容:
mainAxisSize:mainAxisSize.min

对于match_父项:
mainAxisSize:mainAxisSize.max

您可以使用小技巧: 假设您有以下要求: (宽度、高度)

包装内容,包装内容:

 //use this as child
 Wrap(
  children: <Widget>[*your_child*])
 //use this as child
Container(
        height: double.infinity,
    width: double.infinity,child:*your_child*)
 //use this as child
Row(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[*your_child*],
);
 //use this as child
Column(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[your_child],
);
匹配父项,包装内容:

 //use this as child
 Wrap(
  children: <Widget>[*your_child*])
 //use this as child
Container(
        height: double.infinity,
    width: double.infinity,child:*your_child*)
 //use this as child
Row(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[*your_child*],
);
 //use this as child
Column(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[your_child],
);
//将其用作子对象
划船(
mainAxisSize:mainAxisSize.max,
子女:[*您的子女*],
);
包装内容,匹配父项:

 //use this as child
 Wrap(
  children: <Widget>[*your_child*])
 //use this as child
Container(
        height: double.infinity,
    width: double.infinity,child:*your_child*)
 //use this as child
Row(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[*your_child*],
);
 //use this as child
Column(
  mainAxisSize: MainAxisSize.max,
  children: <Widget>[your_child],
);
//将其用作子对象
纵队(
mainAxisSize:mainAxisSize.max,
孩子:[你的孩子],
);

我使用此解决方案,您必须使用MediaQuery定义屏幕的高度和宽度:

 Container(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width
  )

使用小部件包装

对于类似行为的
列,请尝试:

  return Wrap(
          direction: Axis.vertical,
          spacing: 10,
          children: <Widget>[...],);
  return Wrap(
          direction: Axis.horizontal,
          spacing: 10,
          children: <Widget>[...],);

有关更多信息:

使用
部分物理化dbox
小部件

partiallysizedbox(
宽度因子:1.0,//到父级的宽度w.r.t
高度系数:1.0,//相对于父级的w.r.t高度
孩子:*你的孩子在这里*
}
当您希望将孩子的大小设置为其父代大小的一小部分时,此小部件也非常有用

例如:

如果希望子项占据其父项宽度的50%,请提供
widthFactor
作为
0.5


要使子对象填充其父对象,只需将其包装到一个FittedBox中

FittedBox(
子项:Image.asset('foo.png'),
fit:BoxFit.fill,
)
匹配父项 为了匹配或填充父级(高度和宽度),我们可以在
容器上使用额外的
约束

Container(
  constraints: BoxConstraints.expand(), // ← this guy
  child: Text('Center > Container > Text')
)
在颤振中,
约束
是可以填充的空间(如果约束“紧”,则必须填充)

约束是由父母施加的……事实上不是

默认情况下,
容器
会将其内容(
子项:
)包装起来,并将其自身大小调整到其子项,除非覆盖(或严格限制不允许)

使用
constraints:
参数,我们可以提供
Container
附加约束来覆盖默认的
Container
约束行为(例如包装内容)

使用
容器(约束:BoxConstraints.something)
不会覆盖传入/父约束;它只允许我们在允许的情况下覆盖默认行为,例如包装内容


代码示例-BoxConstraints 下面是一个复制/粘贴代码示例,显示了各种
约束的效果
我们可以应用于具有“松散”传入/父约束的
容器
(由
中心提供)

导入“包装:颤振/材料.省道”;
类MatchParentPage扩展StatefulWidget