页面布局

Flutter中的布局是指如何将UI元素组织在屏幕上,以便构建一个美观、有效的用户界面。Flutter中的布局主要使用“盒模型”和“Flex布局”两种方式。

盒模型

在Flutter中,每个UI元素都可以被视为一个矩形盒子,其中包含内容、边框和内边距。这些盒子可以被嵌套,从而形成更复杂的布局。Flutter中的盒模型使用了CSS盒模型的基本概念,包括以下四个属性:

  • margin(外边距):用于控制UI元素与其它元素之间的距离。
  • padding(内边距):用于控制UI元素内部内容与边框之间的距离。
  • border(边框):用于控制UI元素边框的样式、颜色和宽度。
  • content(内容):包含UI元素实际显示的内容。

盒子可以通过Container类来创建,这是Flutter中用于构建盒模型的基本类。下面是一个简单的例子,展示了如何使用Container类来创建一个带有红色边框、黄色背景和一些文本的盒子:

Container(
  margin: EdgeInsets.all(10),
  padding: EdgeInsets.all(10),
  decoration: BoxDecoration(
    color: Colors.yellow,
    border: Border.all(color: Colors.red),
  ),
  child: Text('Hello, Flutter!'),
)

Flex布局

除了盒模型之外,Flutter还提供了一种称为“Flex布局”的方式来构建布局。Flex布局可以看作是一种更高级别的布局方式,它可以更好地控制子元素的位置和大小。在Flutter中,使用Flex布局需要使用两个类:Row和Column。

Row和Column都继承自Flex,是Flex的子类,它们分别用于构建水平方向和垂直方向的布局。它们都可以包含多个子元素,并且可以控制子元素的位置和大小。下面是一个简单的例子,展示了如何使用Row和Column类来构建布局:

Column(
  children: [
    Text('Row 1'),
    Text('Row 2'),
    Text('Row 3'),
  ],
)

Row(
  children: [
    Text('Column 1'),
    Text('Column 2'),
    Text('Column 3'),
  ],
)

这些都是Flutter中基本的布局方式,但实际上Flutter还提供了许多其它的布局方式,如Stack、Expanded等,可以根据具体的应用场景选择合适的布局方式。

Flutter的Layout指的是控件在父控件中的位置和大小,包括绝对布局、相对布局、线性布局、流式布局等多种布局方式。本篇文章将为您介绍Flutter中常用的布局方式。

绝对布局

绝对布局指的是将控件按照绝对位置进行布局,通常使用Positioned控件实现。例如:

Stack(
  children: <Widget>[
    Positioned(
      left: 20,
      top: 20,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.red,
      ),
    ),
    Positioned(
      right: 20,
      top: 20,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.green,
      ),
    ),
  ],
)

相对布局

相对布局指的是控件在父控件中相对于其他控件的位置和大小,通常使用Align或Positioned控件实现。例如:

Stack(
  children: <Widget>[
    Positioned(
      left: 0,
      top: 0,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.red,
      ),
    ),
    Align(
      alignment: Alignment.topRight,
      child: Container(
        width: 100,
        height: 100,
        color: Colors.green,
      ),
    ),
  ],
)

线性布局

线性布局指的是将控件按照一定方向进行布局,通常使用Row或Column控件实现。例如:

Row(
  children: <Widget>[
    Expanded(
      flex: 1,
      child: Container(
        height: 100,
        color: Colors.red,
      ),
    ),
    Expanded(
      flex: 2,
      child: Container(
        height: 100,
        color: Colors.green,
      ),
    ),
    Expanded(
      flex: 1,
      child: Container(
        height: 100,
        color: Colors.blue,
      ),
    ),
  ],
)

流式布局

流式布局指的是控件按照一定规则进行自适应布局,通常使用Wrap或Flow控件实现。

拥有单个子元素的布局widget

Name Desc
Container 一个拥有绘制、定位、调整大小的 widget。
Padding 一个widget, 会给其子widget添加指定的填充
Center 将其子widget居中显示在自身内部的widget
Align 一个widget,它可以将其子widget对齐,并可以根据子widget的大小自动调整大小。
FittedBox 按自己的大小调整其子widget的大小和位置。
AspectRatio 一个widget,试图将子widget的大小指定为某个特定的长宽比
ConstrainedBox 对其子项施加附加约束的widget
Baseline 根据子项的基线对它们的位置进行定位的widget。
FractionallySizedBox 一个widget,它把它的子项放在可用空间的一小部分。关于布局算法的更多细节,见RenderFractionallySizedOverflowBox
IntrinsicHeight 一个widget,它将它的子widget的高度调整其本身实际的高度
IntrinsicWidth 一个widget,它将它的子widget的宽度调整其本身实际的宽度
LimitedBox 一个当其自身不受约束时才限制其大小的盒子
Offstage 一个布局widget,可以控制其子widget的显示和隐藏。
OverflowBox 对其子项施加不同约束的widget,它可能允许子项溢出父级。
SizedBox 一个特定大小的盒子。这个widget强制它的孩子有一个特定的宽度和高度。如果宽度或高度为NULL,则此widget将调整自身大小以匹配该维度中的孩子的大小。
SizedOverflowBox 一个特定大小的widget,但是会将它的原始约束传递给它的孩子,它可能会溢出。
Transform 在绘制子widget之前应用转换的widget。
CustomSingleChildLayout 一个自定义的拥有单个子widget的布局widget

拥有多个子元素的布局widget

Name Desc
Row 在水平方向上排列子widget的列表。
Column 在垂直方向上排列子widget的列表。
Stack 可以允许其子widget简单的堆叠在一起
IndexedStack 从一个子widget列表中显示单个孩子的Stack
Flow 一个实现流式布局算法的widget
Table 为其子widget使用表格布局算法的widget
Wrap 可以在水平或垂直方向多行显示其子widget 。
ListBody 一个widget,它沿着一个给定的轴,顺序排列它的子元素
ListView 可滚动的列表控件。ListView是最常用的滚动widget,它在滚动方向上一个接一个地显示它的孩子。在纵轴上,孩子们被要求填充ListView。
CustomMultiChildLayout 使用一个委托来对多个孩子进行设置大小和定位的小部件

Layout helpers

Name Desc
LayoutBuilder 构建一个可以依赖父窗口大小的widget树。
powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:00

results matching ""

    No results matching ""