Flutter那些事-组件篇

40 阅读5分钟

Container

Container 是 Flutter 中一个便利的 widget,它本身是一个无状态 widget,其核心作用是将多个基础的绘制、定位和尺寸控制 widget(如 PaddingAlignColoredBoxConstrainedBoxDecoratedBox 和 Transform 等)组合在一起 -2-10
它的布局行为相对复杂,遵循一套特定的规则:默认情况下,有子节点时,它会调整自身大小以适应子节点;无子节点时,它会尽可能撑满父级约束。如果同时指定了宽高,则会严格按照宽高进行渲染 -2-6。你可以把它理解为一个功能全面的基础容器,通过简单属性即可实现背景、边框、边距、对齐和变换等多种效果。

常见属性

属性类别关键属性说明
布局定位alignment控制child组件在容器内的对齐方式
尺寸控制width/height/constrains设置容器的宽度和高度/为容器设置更复杂的尺寸约束(最小/最大宽高)
间距magin/padding按照比例分配剩余空间,实现自适应布局。常与Row和Column配合使用
装饰color为容器设置一个简单的背景颜色
装饰decoration为容器设置一个复杂的背景装饰
变换效果transform对容器机器内容进行矩阵变换
子组件child容器内包含的唯一直接子组件

代码演示

import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MainPage());
}
class MainPage extends StatelessWidget {
  const MainPage({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home:Scaffold(
        body: Container(
          transform: Matrix4.rotationZ(0.05),
          margin: EdgeInsets.all(20),
          width: 300,
          height: 300,
          alignment: Alignment.center,
          decoration: BoxDecoration(
            color: Colors.blue,
            borderRadius:BorderRadius.circular(15),
            border:Border.all(width: 3,color: Colors.amber)
          ),
          child: Text("测试12",
            style: TextStyle(fontSize: 20,color: Colors.white),
          ),
        ),
      ),
    );

  }
}

Center

Center 是一个用于将其子组件在其自身内部进行水平和垂直居中的布局 widget -3。它的职能非常纯粹,负责处理子组件的对齐方式。在布局行为上,如果其尺寸受到父容器约束并且未设置尺寸因子,它会尽可能占据所有可用空间;如果某个维度不受约束,则该维度尺寸将与子组件尺寸一致 -3。你可以把它看作是实现“居中”这一最常见布局需求的最直接、最语义化的工具 -2-7-8

代码示例

import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MainPage());
}
class MainPage extends StatelessWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Cenrer组件"),
        ),
        body: Center(
          child: Container(
            width: 300,
            height: 300,
            decoration: BoxDecoration(
              color: Colors.blue
            ),
            child: Center(
              child: Text("居中测试内容",style: TextStyle(fontSize: 15,color:Colors.white)),
            ),
          ),
        ),
      ),
    );
  }
}

Align

Align 是一个用于控制子组件在其自身边界内如何对齐的布局组件,通过 alignment 参数即可实现从左上到右下各个角落的精准定位。

属性名称说明
alignment对齐方式子组件在父容器中的对齐方式
widthFactor宽度因子align子组件的宽度乘以该因子
heightFactor高度因子align子组件的高度乘以该因子
import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MainPage());
}
class MainPage extends StatelessWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home:Scaffold(
        appBar: AppBar(
          title: Text("Align数据展示"),
        ),
        body: Container(
          color: Colors.red,
          child: Align(
            widthFactor: 4,
            heightFactor: 3,
            alignment: Alignment.center,
            child: Icon(
              Icons.star,
              size: 150,
              color:Colors.amber
            ),
          ),
        ),
      )
    );
  }
}

Padding

Padding 是一个用于给子Widget添加内边距(留白)的基础布局组件。它会在其子Widget的周围创建空白空间,类似于Web开发中的padding属性。

属性类型描述
paddingEdgeInsetsGeometry必需,指定内边距的大小和方向
childWidget被包裹的子Widget

EdgeInsets 使用方式

Padding组件通过EdgeInsets类来定义内边距,有以下常用方式:

// 1. 所有方向相同的边距
padding: EdgeInsets.all(16.0)

// 2. 单独设置水平和垂直
padding: EdgeInsets.symmetric(
  horizontal: 16.0,  // 左右
  vertical: 8.0       // 上下
)

// 3. 单独设置四个方向
padding: EdgeInsets.only(
  left: 8.0,
  top: 16.0,
  right: 8.0,
  bottom: 16.0
)

// 4. 使用LTRB(左、上、右、下)
padding: EdgeInsets.fromLTRB(8.0, 16.0, 8.0, 16.0)

代码演示

import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MainPage());
}

class MainPage extends StatelessWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Padding组件演示"),

        ),
        body: Container(
          
          decoration: BoxDecoration(
            color: Colors.amber,
          ),
          child: Padding(
            // 边距一致时
            padding: EdgeInsets.all(20),   
            // 边距不一致
            padding: EdgeInsets.only(top:5,right: 10,bottom: 20,left: 30),   
            // 顶部与底部一致  左边与右边一致时
            padding:EdgeInsets.symmetric(vertical: 10,horizontal: 20),   
            // 使用fromLTRB方法设置
            padding:EdgeInsets.fromLTRB(3, 10, 30, 20),
            child: Container(
              decoration: BoxDecoration(
                color: Colors.red
              ),
            ),
            
          ),
        ),
      ),
    );
  }
}

Cloumn

Column 是一个用于在垂直方向上排列子Widget的多子布局组件。它会将子组件沿着垂直轴(从上到下)依次排列,是Flutter中最常用的布局组件之一。

关键属性

属性类型描述
mainAxisAlignmentMainAxisAlignment主轴的对齐方式
crossAxisAlignmentCrossAxisAlignment交叉轴的对齐方式
mainAxisAlignmentMainAxisAlignment主轴方向占用的空间大小
childrenlist<Widget>必需,需要排列的子组件列表

对齐方式 mainAxisAlignment(主轴对齐)

Column(
  mainAxisAlignment: MainAxisAlignment.start,    // 顶部对齐(默认)
  mainAxisAlignment: MainAxisAlignment.end,      // 底部对齐
  mainAxisAlignment: MainAxisAlignment.center,   // 居中对齐
  mainAxisAlignment: MainAxisAlignment.spaceBetween, // 两端对齐,子组件间间距相等
  mainAxisAlignment: MainAxisAlignment.spaceAround,  // 子组件周围间距相等
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,  // 子组件及两端间距都相等
  children: [...],
)

crossAxisAlignment(交叉轴对齐)

Column(
  crossAxisAlignment: CrossAxisAlignment.start,   // 左对齐
  crossAxisAlignment: CrossAxisAlignment.end,      // 右对齐  
  crossAxisAlignment: CrossAxisAlignment.center,   // 居中对齐(默认)
  crossAxisAlignment: CrossAxisAlignment.stretch,  // 拉伸填满宽度
  crossAxisAlignment: CrossAxisAlignment.baseline, // 基于文本基线对齐
  children: [...],
)

代码示例

import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MainPage());  
}
class MainPage extends StatelessWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("cloumn代码演示"),
        ),
        body: Container(
          width: double.infinity,
          height: double.infinity,
          decoration: BoxDecoration(
            color: Colors.amber
          ),
          child: Column(
            // 主轴对齐方式
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            // mainAxisAlignment: MainAxisAlignment.spaceBetween,
            // mainAxisAlignment:MainAxisAlignment.spaceEvenly,
            // mainAxisAlignment:MainAxisAlignment.start,
            // mainAxisAlignment:MainAxisAlignment.center,
            // mainAxisAlignment:MainAxisAlignment.end,
            // 交叉轴对齐方式
            // crossAxisAlignment: CrossAxisAlignment.start,
            // crossAxisAlignment: CrossAxisAlignment.stretch,
            crossAxisAlignment:CrossAxisAlignment.center,
            // crossAxisAlignment: CrossAxisAlignment.end,
            children: [
              Container(
                width: 100,
                height: 100,
                decoration: BoxDecoration(
                  color: Colors.blue,
                  borderRadius: BorderRadius.circular(10)
                ),
                child: Icon(
                  Icons.access_time_sharp,
                  size: 90,
                ),
                
              ),
              Container(
                width: 100,
                height: 100,
                margin: EdgeInsets.only(top:10),
                decoration: BoxDecoration(
                  color: Colors.red,
                  borderRadius: BorderRadius.circular(10)
                ),
                child: Icon(
                  Icons.abc,
                  size: 90,
                ),
              ),
              Container(
                width: 100,
                height: 100,
                margin: EdgeInsets.only(top:10),
                decoration: BoxDecoration(
                  color: Colors.green,
                  borderRadius:BorderRadius.circular(10)
                ),
                child: Icon(
                  Icons.add_circle_outline_rounded,
                  size: 90,
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

Row

Row 是一个用于在水平方向上排列子Widget的多子布局组件。它会将子组件沿着水平轴(从左到右)依次排列,是Flutter中最常用的布局组件之一。

关键属性

属性类型描述
mainAxisAlignmentMainAxisAlignment主轴的对齐方式
crossAxisAlignmentCrossAxisAlignment交叉轴的对齐方式
mainAxisAlignmentMainAxisAlignment主轴方向占用的空间大小
childrenlist<Widget>必需,需要排列的子组件列表
import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MainPage());
}
class MainPage extends StatelessWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Row组件"),
        ),
        body: Container(
          width: double.infinity,
          height: double.infinity,
          child: Row(
            // 水平排列
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Container(
                width: 200,
                height: 200,
                color: Colors.amber,
              ),
              SizedBox(
                width: 10,
              ),
              Container(
                width: 200,
                height: 200,
                color: Colors.amber,
              ),
              SizedBox(
                width: 10,
              ),
              Container(
                width: 200,
                height: 200,
                color: Colors.amber,
              ),
            ],
          ),
        ),
      ),
    );
  }
}