You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Widgetbuild(BuildContext context) {
returnScaffold(
appBar:AppBar(title:Text('SliverFillRemaining')),
body:CustomScrollView(
slivers: [
SliverFillRemaining(
hasScrollBody:false,
child:Column(
mainAxisAlignment:MainAxisAlignment.center,
children:const [
FlutterLogo(size:200),
Text(
'This is some longest text that should be centered''together with the logo',
textAlign:TextAlign.center,
),
],
),
),
],
),
);
}
你是否需要了解
Flutter
布局的案例?这里我将展示我在使用
Flutter
布局的代码片段。我将通过精美的代码片段结合可视化的图形来举例。本文注重
Flutter
部件中比较有用的一些来展示,而不是走马观花展示一大推的部件内容。Row and Column
MainAxisAlignment
CrossAxisAlignment
如果你需要文本是针对基线对齐,那么你应该使用
CrossAxisAlignment.baseline
。MainAxisSize
IntrinsicWidth and IntrinsicHeight
在行列布局中,如何使得所有的部件跟宽度/高度最大的部件同宽/同高呢?如下:
我们假有下面的布局:
那么,你想所有的按钮的宽度都跟最宽的按钮那么宽,那就使用
IntrinsicWidth
:同理,如果你想所有的部件的高度跟最高的部件一样高,你需要结合
IntrinsicHeight
和Row
来实现。Stack
Stack
很适合小部件相互叠加。使用自己的部件,你需要将它们放在
Positioned
部件中。如果你不想猜测顶部/底部的值,你可以使用
LayoutBuilder
部件来检索它们的值。Expanded
Expanded
配合 Flex\Flexbox 布局实现,它对于多项目分配空间很棒。ConstrainedBox
默认的,很多部件多尽量使用小空间,比如:
ConstrainedBox
允许小部件根据需要使用剩下的空间。使用
BoxConstraints
,你可以指定一个小部件可以有多少空间,你可以指定高度/宽度的最小/最大值。除非指定值,否则
BoxConstraints.expand
使用无限的空间量(也就是使用剩下的所有空间):上面👆的写法等同下面👇的写法:
Align
有时候,我们很难设置我们的小部件到正确的大小 -- 比如,它们自由伸展,但是这不是你想要的。
当你在
Column
中使用CrossAxisAlignment.stretch
的时候,上面的现象就会发生,而你想要的是这个按钮不伸展。当你的小部件并不受限你设定的约束时,那么你可以尝试使用
Align
部件包裹它。Container
Container
是最常用的部件之一 -- 有如下的好处:Container as a layout tool
当你没有指定
Container
的高度height
或者宽度width
的时候,它会自动适配child
子部件的大小。如果你想伸展
Container
来适配它的父部件,请为属性高度height
或宽度width
设定值double.infinity
。Container as decoration
你可以使用
Container
的color
属性来更改其背景颜色,但是你也可以使用decoration
和foregroundDecoration
来更改。(使用这两个属性,你完全可以更改Container
的样子,这个我们迟点说)。decoration
总是在child
属性的后面,而foregroundDecoration
总是在child
属性的后面。(这也不一定)Container as Transform
如果你不想使用
Transform
部件来更改布局,你可以直接使用Container
中的transform
属性。BoxDecoration
decoration
通常用于更改Container
部件的外观。image: DecorationImage
图片作为背景:
border: Border
指定
Container
的边框看起来该怎样。borderRadius: BorderRadius
使得边框角变圆。
如果装饰中
shape
属性的值是BoxShape.circle
,那么borderRadius
不会起作用。shape: BoxShape
BoxDecoration
可以是矩形/正方形或者椭圆/圆形。对于其他形状,你可以使用
ShapeDecoration
代替BoxDecoration
。boxShadow: List
为
Container
添加阴影。这个参数是一个列表,你可以指定多个不同的阴影并将它们合并在一起。
gradient
有三种类型的渐变:
LinearGradient
,RadialGradient
和SweepGradient
。backgroundBlendMode
backgroundBlendMode
是BoxDecoration
中最复杂的属性之一。它负责将
BoxDecoration
中颜色/渐变,以及BoxDecoration
上的任何内容混合一起。使用
backgroundBlendMode
, 你可以使用BlendMode
枚举中指定的一长串算法。首先,让我们将
BoxDecoration
设置为foregroundDecoration
,它被绘制在Container
子部件之上(而decoration
会绘制在子部件之后)。backgroundBlendMode
不仅仅影响它所在的Container
。backgroundBlendMode
改变其所在Container
及其一下部件树的内容的颜色。下面的代码又一个父部件
Container
来绘制一个image
,然后有一个子部件Container
来使用backgroundBlendMode
,但是你还是获取到和之前的效果。Material
有切角的边框。
Slivers
SliverFillRemaining
即便没有足够的空间,当你想要将内容居中,这个部件也是不可替代的。
如果居中的内容没有足够的空间,
SliverFillRemaining
将变为可滚动。如果没使用
SliverFillRemaining
,内容将会像下面这样溢出:Filling the remaining space
除了对内容居中有用之外,
SliverFillRemaining
还会填充剩余视口的可用空间。为此,此部件必须放置在CustomScrollView
中,并且必须是最后一个sliver
。如果没有足够的空间,部件将变为可滚动。
SizedBox
SizedBox
是最简单但是最常用的小部件之一。SizedBox as ConstrainedBox
SizedBox
工作方式跟ConstrainedBox
有些类似。SizedBox as padding
当需要添加内边距和外边距的时候,你可以选择
Padding
或Container
小部件。但是,它们可以比添加Sizedbox
更冗长且可读性更低。SizedBox as an Invisible Object
很多时候,你想通过设置一个
bool
值来隐藏/展示小部件。因为
SizedBox
有一个const
构造函数,所以使用const SizeBox()
真的很便宜。一种更便宜的解决方案是使用Opacity
小部件,将其opacity
值更改为0.0
。这种解决方案的缺点是给定的小部件只是不可见,但是还是占用空间。SafeArea
在不同的平台,有些特定的区域,比如安卓的状态栏或者
iPhone X
的刘海区块,我们不应该在其下面绘制内容。解决方案是使用
SafeArea
小部件。(下面截图是没使用/使用SafeArea
)本文翻译自 Flutter Layout Cheat Sheet。代码已经验证,需要留意
RaisedButton
已经被ElevatedButton
替代,在现实使用中需要留意。本文重点是其布局思路和技巧。The text was updated successfully, but these errors were encountered: