基础入门 Flutter for OpenHarmony:Container — 布局的万能容器

🎯欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
📦 本文将带你深入了解 Flutter 中最基础却最强大的布局组件------Container,掌握它就等于掌握了 Flutter 布局的一半。


一、Container 组件概述

在 Flutter 的组件体系中,Container 可以说是最基础也是最常用的组件之一。它就像一个万能的容器,可以包含一个子组件,并为其提供丰富的装饰和布局属性。无论是设置背景色、圆角、阴影,还是添加内边距、外边距,Container 都能轻松实现。

🎯 为什么 Container 如此重要?

Container 的重要性体现在以下几个方面:

  • 视觉装饰 :通过 decoration 属性,可以设置背景色、边框、圆角、阴影等各种视觉效果
  • 尺寸控制 :通过 widthheightconstraints 等属性,精确控制组件的大小
  • 位置调整 :通过 paddingmarginalignment 等属性,灵活调整子组件的位置
  • 变换效果 :通过 transform 属性,实现旋转、缩放、平移等变换效果

💡 核心思想:Container 本身不包含任何复杂的布局逻辑,它的强大之处在于能够将各种视觉效果和布局属性组合在一起,形成一个完整的视觉单元。


二、基础属性详解

2.1 width 和 height

widthheight 是最基础的尺寸属性,用于指定 Container 的宽度和高度。

dart 复制代码
Container(
  width: 200,
  height: 100,
  color: Colors.blue,
  child: const Text('固定尺寸'),
)

当同时设置 widthheight 时,Container 会严格按照指定的尺寸显示。如果只设置其中一个,另一个维度会根据子组件的大小自适应。

⚠️ 注意 :如果 Container 的父组件有约束(比如在 Expanded 中),设置的尺寸可能会被忽略。此时可以使用 unconstrainedBox 来解除约束。

2.2 padding 和 margin

padding 是内边距,控制子组件与 Container 边界的距离;margin 是外边距,控制 Container 与周围组件的距离。

dart 复制代码
Container(
  margin: const EdgeInsets.all(20),
  padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(12),
  ),
  child: const Text('带内边距和外边距的容器'),
)

EdgeInsets 提供了多种便捷方法来设置边距:

方法 说明 使用场景
all(16) 四周相同 统一的内边距或外边距
symmetric(horizontal: 16, vertical: 8) 水平和垂直不同 需要区分横向和纵向间距
only(left: 16, top: 8) 单独设置每一边 需要精确控制每一边的间距
fromLTRB(16, 8, 16, 8) 依次设置左上右下 需要完全自定义的情况

2.3 decoration

decoration 是 Container 最强大的属性,通过 BoxDecoration 可以实现丰富的视觉效果。

dart 复制代码
Container(
  width: 200,
  height: 100,
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
    border: Border.all(color: Colors.blueAccent, width: 2),
    boxShadow: [
      BoxShadow(
        color: Colors.black.withOpacity(0.2),
        blurRadius: 8,
        offset: const Offset(0, 4),
      ),
    ],
  ),
  child: const Center(child: Text('装饰效果')),
)

三、BoxDecoration 详解

3.1 背景颜色 color

color 是最简单的背景设置,可以使用任何 Color 对象。

dart 复制代码
Container(
  width: 100,
  height: 100,
  decoration: const BoxDecoration(
    color: Colors.blue,
  ),
)

💡 小贴士 :当同时使用 decorationContainer.color 时,decoration.color 会覆盖 Container.color。建议始终使用 decoration.color 来保持代码的一致性。

3.2 渐变背景 gradient

使用 gradient 可以创建渐变背景,包括线性渐变和径向渐变。

线性渐变 LinearGradient
dart 复制代码
Container(
  width: 200,
  height: 100,
  decoration: BoxDecoration(
    gradient: const LinearGradient(
      colors: [Colors.blue, Colors.purple],
      begin: Alignment.topLeft,
      end: Alignment.bottomRight,
    ),
  ),
)

LinearGradientbeginend 参数控制渐变的方向,使用 Alignment 类可以方便地指定各个方向。

径向渐变 RadialGradient
dart 复制代码
Container(
  width: 200,
  height: 200,
  decoration: BoxDecoration(
    gradient: RadialGradient(
      colors: [Colors.yellow, Colors.orange, Colors.red],
      radius: 0.8,
      center: const Alignment(0.5, 0.5),
    ),
  ),
)

径向渐变从中心向外扩散,常用于创建圆形的渐变效果,如按钮、头像等。

🎨 常用渐变方向对照

方向 Alignment 值 说明
从上到下 topCenterbottomCenter 垂直渐变
从左到右 centerLeftcenterRight 水平渐变
对角线 topLeftbottomRight 最常用的渐变方向
反向对角线 topRightbottomLeft 交叉渐变

四、边框与圆角

4.1 圆角 borderRadius

borderRadius 可以为 Container 添加圆角效果,支持各种圆角组合。

dart 复制代码
Container(
  width: 200,
  height: 100,
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(16),
  ),
)

BorderRadius 提供了多种创建圆角的方式:

dart 复制代码
// 统一圆角
BorderRadius.circular(16)

// 分别设置每个角
BorderRadius.only(
  topLeft: Radius.circular(16),
  topRight: Radius.circular(8),
  bottomLeft: Radius.circular(8),
  bottomRight: Radius.circular(16),
)

// 水平和垂直不同
BorderRadius.vertical(top: Radius.circular(16), bottom: Radius.circular(8))

不同的圆角组合可以创造出独特的视觉效果,如卡片、对话框等。

4.2 边框 border

border 可以为 Container 添加边框,支持单独设置每一边的样式。

dart 复制代码
Container(
  width: 200,
  height: 100,
  decoration: BoxDecoration(
    color: Colors.white,
    border: Border.all(
      color: Colors.blue,
      width: 2,
      style: BorderStyle.solid,
    ),
    borderRadius: BorderRadius.circular(12),
  ),
)

也可以为每一边设置不同的边框:

dart 复制代码
decoration: BoxDecoration(
  border: Border(
    left: BorderSide(color: Colors.red, width: 4),
    right: BorderSide(color: Colors.blue, width: 4),
  ),
)

4.3 圆形容器

borderRadius 的半径等于 Container 宽度的一半时,可以创建一个完美的圆形容器。

dart 复制代码
Container(
  width: 100,
  height: 100,
  decoration: BoxDecoration(
    gradient: const LinearGradient(
      colors: [Colors.pink, Colors.purple],
    ),
    borderRadius: BorderRadius.circular(50), // 宽度的一半
  ),
)

或者更简洁地使用 BoxShape.circle

dart 复制代码
Container(
  width: 100,
  height: 100,
  decoration: const BoxDecoration(
    shape: BoxShape.circle,
    gradient: LinearGradient(
      colors: [Colors.pink, Colors.purple],
    ),
  ),
)

五、阴影效果

5.1 基础阴影

boxShadow 可以为 Container 添加阴影,增加立体感和层次感。

dart 复制代码
Container(
  width: 200,
  height: 100,
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(12),
    boxShadow: [
      BoxShadow(
        color: Colors.black.withOpacity(0.2),
        blurRadius: 10,
        offset: const Offset(0, 5),
      ),
    ],
  ),
)

BoxShadow 的参数说明:

参数 类型 说明 典型值
color Color 阴影颜色 Colors.black.withOpacity(0.2)
blurRadius double 模糊半径 8 - 20
offset Offset 阴影偏移 Offset(0, 4)
spreadRadius double 扩散半径 0 - 10

5.2 多重阴影

可以叠加多个阴影,创造出更丰富的视觉效果。

dart 复制代码
Container(
  width: 200,
  height: 100,
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(12),
    boxShadow: [
      BoxShadow(
        color: Colors.black.withOpacity(0.1),
        blurRadius: 10,
        offset: const Offset(0, 4),
      ),
      BoxShadow(
        color: Colors.black.withOpacity(0.05),
        blurRadius: 20,
        offset: const Offset(0, 10),
      ),
    ],
  ),
)

5.3 霓虹发光效果

通过调整阴影参数,可以创建霓虹发光效果。

dart 复制代码
Container(
  width: 200,
  height: 100,
  decoration: BoxDecoration(
    color: Colors.purple,
    borderRadius: BorderRadius.circular(12),
    boxShadow: [
      BoxShadow(
        color: Colors.purple.withOpacity(0.6),
        blurRadius: 20,
        offset: Offset.zero,
      ),
      BoxShadow(
        color: Colors.purple.withOpacity(0.3),
        blurRadius: 40,
        offset: Offset.zero,
      ),
    ],
  ),
)

六、尺寸约束 constraints

6.1 BoxConstraints

constraints 可以更灵活地控制 Container 的尺寸,设置最小值、最大值等。

dart 复制代码
Container(
  constraints: const BoxConstraints(
    minWidth: 100,
    maxWidth: 300,
    minHeight: 50,
    maxHeight: 150,
  ),
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
  child: const Text('约束尺寸'),
)

BoxConstraints 提供了多个便捷方法:

dart 复制代码
// 固定尺寸
BoxConstraints.tight(Size(200, 100))

// 宽松约束(子组件可以超出)
BoxConstraints.loose(Size(200, 100))

// 扩充(填满父组件)
BoxConstraints.expand()

// 仅限制最小尺寸
BoxConstraints(minWidth: 100, minHeight: 50)

6.2 响应式尺寸

使用 MediaQuery 可以根据屏幕尺寸动态调整 Container 的大小。

dart 复制代码
Container(
  width: MediaQuery.of(context).size.width * 0.8,
  height: MediaQuery.of(context).size.height * 0.2,
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
)

💡 小贴士 :对于复杂的响应式布局,建议使用 LayoutBuilder 来获取父组件的约束,而不是直接依赖 MediaQuery


七、变换效果 transform

7.1 基础变换

transform 可以对 Container 进行旋转、缩放、平移等变换。

dart 复制代码
Container(
  width: 100,
  height: 100,
  transform: Matrix4.rotationZ(0.2),
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
)

Matrix4 提供了多种变换方法:

方法 说明 参数
rotationZ(radians) 绕 Z 轴旋转 弧度值
rotationX(radians) 绕 X 轴旋转 弧度值
rotationY(radians) 绕 Y 轴旋转 弧度值
scale(s) 等比缩放 缩放比例
translationValues(x, y, z) 平移 X、Y、Z 轴偏移量

7.2 组合变换

可以将多个变换组合在一起。

dart 复制代码
Container(
  width: 100,
  height: 100,
  transform: Matrix4.identity()
    ..rotateZ(0.2)
    ..scale(1.2),
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
)

7.3 对齐变换 origin

alignment 可以指定变换的原点位置。

dart 复制代码
Container(
  width: 100,
  height: 100,
  alignment: Alignment.topLeft,
  transform: Matrix4.rotationZ(0.2),
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
)

八、对齐方式 alignment

8.1 子组件对齐

alignment 控制子组件在 Container 内的对齐方式。

dart 复制代码
Container(
  width: 200,
  height: 100,
  alignment: Alignment.center,
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
  child: const Text('居中对齐'),
)

Alignment 提供了多个预定义的位置:

说明
Alignment.topLeft 左上角
Alignment.topCenter 顶部居中
Alignment.topRight 右上角
Alignment.centerLeft 左侧居中
Alignment.center 完全居中
Alignment.centerRight 右侧居中
Alignment.bottomLeft 左下角
Alignment.bottomCenter 底部居中
Alignment.bottomRight 右下角

8.2 精确对齐

可以使用 Alignment(x, y) 来精确指定对齐位置,x 和 y 的范围是 -1 到 1。

dart 复制代码
Container(
  width: 200,
  height: 100,
  alignment: const Alignment(0.5, 0.3), // x=0.5(偏右),y=0.3(偏上)
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(12),
  ),
  child: const Text('精确对齐'),
)

九、实际应用场景

9.1 卡片组件

dart 复制代码
Container(
  margin: const EdgeInsets.all(16),
  padding: const EdgeInsets.all(20),
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(16),
    boxShadow: [
      BoxShadow(
        color: Colors.black.withOpacity(0.1),
        blurRadius: 12,
        offset: const Offset(0, 4),
      ),
    ],
  ),
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      const Text(
        '卡片标题',
        style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
      ),
      const SizedBox(height: 8),
      Text(
        '这是卡片的内容区域。Container 通过装饰属性可以轻松创建漂亮的卡片效果。',
        style: TextStyle(color: Colors.grey[600]),
      ),
    ],
  ),
)

9.2 按钮

dart 复制代码
GestureDetector(
  onTap: () {
    // 点击事件
  },
  child: Container(
    padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16),
    decoration: BoxDecoration(
      gradient: const LinearGradient(
        colors: [Colors.blue, Colors.purple],
      ),
      borderRadius: BorderRadius.circular(12),
      boxShadow: [
        BoxShadow(
          color: Colors.blue.withOpacity(0.4),
          blurRadius: 12,
          offset: const Offset(0, 4),
        ),
      ],
    ),
    child: const Text(
      '点击我',
      style: TextStyle(
        color: Colors.white,
        fontSize: 16,
        fontWeight: FontWeight.bold,
      ),
    ),
  ),
)

9.3 头像

dart 复制代码
Container(
  width: 80,
  height: 80,
  decoration: BoxDecoration(
    shape: BoxShape.circle,
    border: Border.all(
      color: Colors.white,
      width: 3,
    ),
    boxShadow: [
      BoxShadow(
        color: Colors.black.withOpacity(0.2),
        blurRadius: 10,
        offset: const Offset(0, 4),
      ),
    ],
    image: const DecorationImage(
      image: NetworkImage('https://picsum.photos/200/200'),
      fit: BoxFit.cover,
    ),
  ),
)

十、性能优化

10.1 避免不必要的 Container

虽然 Container 很强大,但过度使用会增加不必要的渲染层级。在简单场景下,可以考虑使用更轻量的组件。

dart 复制代码
// ❌ 不必要的 Container
Container(
  padding: const EdgeInsets.all(16),
  color: Colors.blue,
  child: const Text('Hello'),
)

// ✅ 使用 ColoredBox
ColoredBox(
  color: Colors.blue,
  child: Padding(
    padding: const EdgeInsets.all(16),
    child: const Text('Hello'),
  ),
)

10.2 使用 const

对于不变的 Container,使用 const 修饰符可以避免重复构建。

dart 复制代码
const CardContainer = Container(
  padding: EdgeInsets.all(16),
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.all(Radius.circular(12)),
  ),
);

10.3 合并装饰属性

将多个装饰属性合并到一个 Container 中,而不是嵌套多个 Container。

dart 复制代码
// ❌ 嵌套 Container
Container(
  padding: const EdgeInsets.all(16),
  child: Container(
    decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.circular(12),
    ),
    child: const Text('Hello'),
  ),
)

// ✅ 合并属性
Container(
  padding: const EdgeInsets.all(16),
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(12),
  ),
  child: const Text('Hello'),
)

十一、完整示例代码

下面是一个完整的 Flutter 应用示例,展示 Container 组件的各种效果。

dart 复制代码
import 'package:flutter/material.dart';

void main() {
  runApp(const ContainerDemo());
}

class ContainerDemo extends StatelessWidget {
  const ContainerDemo({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Container 组件演示',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.dark(
          primary: const Color(0xFF6366F1),
          secondary: const Color(0xFF8B5CF6),
          surface: const Color(0xFF1E293B),
          background: const Color(0xFF0F172A),
          brightness: Brightness.dark,
        ),
        useMaterial3: true,
      ),
      home: const ContainerPage(),
    );
  }
}

class ContainerPage extends StatelessWidget {
  const ContainerPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xFF0F172A),
      body: SafeArea(
        child: SingleChildScrollView(
          padding: const EdgeInsets.all(20),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              // 标题区域
              Container(
                padding: const EdgeInsets.all(24),
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    begin: Alignment.topLeft,
                    end: Alignment.bottomRight,
                    colors: [
                      const Color(0xFF6366F1).withOpacity(0.2),
                      const Color(0xFF8B5CF6).withOpacity(0.2),
                    ],
                  ),
                  borderRadius: BorderRadius.circular(20),
                  border: Border.all(
                    color: Colors.white.withOpacity(0.1),
                  ),
                ),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    const Text(
                      '📦 Container 组件',
                      style: TextStyle(
                        fontSize: 28,
                        fontWeight: FontWeight.bold,
                        color: Colors.white,
                        letterSpacing: 0.5,
                      ),
                    ),
                    const SizedBox(height: 8),
                    Text(
                      '探索 Flutter 中万能容器组件的各种用法',
                      style: TextStyle(
                        fontSize: 14,
                        color: Colors.white.withOpacity(0.7),
                        height: 1.5,
                      ),
                    ),
                  ],
                ),
              ),

              const SizedBox(height: 32),

              // 基础颜色
              _buildSection(
                title: '基础颜色效果',
                icon: Icons.color_lens,
                color: Colors.blue,
                child: _buildContainerCard([
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      _buildColorContainer('蓝色', Colors.blue),
                      _buildColorContainer('绿色', Colors.green),
                      _buildColorContainer('橙色', Colors.orange),
                      _buildColorContainer('紫色', Colors.purple),
                    ],
                  ),
                ]),
              ),

              const SizedBox(height: 24),

              // 渐变背景
              _buildSection(
                title: '渐变背景效果',
                icon: Icons.gradient,
                color: Colors.purple,
                child: _buildContainerCard([
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      _buildGradientContainer('线性', _bluePurpleGradient),
                      _buildGradientContainer('径向', _yellowRedGradient),
                    ],
                  ),
                ]),
              ),

              const SizedBox(height: 24),

              // 圆角效果
              _buildSection(
                title: '圆角效果',
                icon: Icons.rounded_corner,
                color: Colors.green,
                child: _buildContainerCard([
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      _buildRoundedContainer('4px', 4),
                      _buildRoundedContainer('12px', 12),
                      _buildRoundedContainer('24px', 24),
                      _buildCircularContainer('圆形'),
                    ],
                  ),
                ]),
              ),

              const SizedBox(height: 24),

              // 边框效果
              _buildSection(
                title: '边框效果',
                icon: Icons.border_outer,
                color: Colors.orange,
                child: _buildContainerCard([
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      _buildBorderContainer('蓝色边框', Colors.blue),
                      _buildBorderContainer('红色边框', Colors.red),
                      _buildBorderContainer('虚线边框', Colors.green, dashed: true),
                    ],
                  ),
                ]),
              ),

              const SizedBox(height: 24),

              // 阴影效果
              _buildSection(
                title: '阴影效果',
                icon: Icons.layers,
                color: Colors.pink,
                child: _buildContainerCard([
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      _buildShadowContainer('轻度', 4, 2),
                      _buildShadowContainer('中度', 12, 6),
                      _buildShadowContainer('重度', 24, 12),
                      _buildGlowContainer('发光'),
                    ],
                  ),
                ]),
              ),

              const SizedBox(height: 24),

              // 实际应用
              _buildSection(
                title: '实际应用示例',
                icon: Icons.widgets,
                color: Colors.cyan,
                child: _buildContainerCard([
                  _buildCardExample(),
                  const SizedBox(height: 16),
                  _buildButtonExample(),
                ]),
              ),

              const SizedBox(height: 80),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildSection({
    required String title,
    required IconData icon,
    required Color color,
    required Widget child,
  }) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Row(
          children: [
            Container(
              padding: const EdgeInsets.all(8),
              decoration: BoxDecoration(
                color: color.withOpacity(0.2),
                borderRadius: BorderRadius.circular(10),
              ),
              child: Icon(icon, color: color, size: 20),
            ),
            const SizedBox(width: 12),
            Text(
              title,
              style: const TextStyle(
                fontSize: 18,
                fontWeight: FontWeight.w600,
                color: Colors.white,
              ),
            ),
          ],
        ),
        const SizedBox(height: 12),
        child,
      ],
    );
  }

  Widget _buildContainerCard(List<Widget> children) {
    return Container(
      width: double.infinity,
      padding: const EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: Colors.white.withOpacity(0.03),
        borderRadius: BorderRadius.circular(16),
        border: Border.all(
          color: Colors.white.withOpacity(0.05),
        ),
      ),
      child: Column(
        children: children,
      ),
    );
  }

  Widget _buildColorContainer(String label, Color color) {
    return Column(
      children: [
        Container(
          width: 70,
          height: 70,
          decoration: BoxDecoration(
            color: color,
            borderRadius: BorderRadius.circular(12),
          ),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: TextStyle(
            fontSize: 12,
            color: Colors.white.withOpacity(0.7),
          ),
        ),
      ],
    );
  }

  Widget _buildGradientContainer(String label, Gradient gradient) {
    return Column(
      children: [
        Container(
          width: 80,
          height: 70,
          decoration: BoxDecoration(
            gradient: gradient,
            borderRadius: BorderRadius.circular(12),
          ),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: TextStyle(
            fontSize: 12,
            color: Colors.white.withOpacity(0.7),
          ),
        ),
      ],
    );
  }

  LinearGradient get _bluePurpleGradient => const LinearGradient(
        colors: [Color(0xFF6366F1), Color(0xFF8B5CF6)],
        begin: Alignment.topLeft,
        end: Alignment.bottomRight,
      );

  RadialGradient get _yellowRedGradient => RadialGradient(
        colors: [
          const Color(0xFFF59E0B),
          const Color(0xFFEF4444),
        ],
        radius: 0.8,
      );

  Widget _buildRoundedContainer(String label, double radius) {
    return Column(
      children: [
        Container(
          width: 70,
          height: 70,
          decoration: BoxDecoration(
            color: Colors.green,
            borderRadius: BorderRadius.circular(radius),
          ),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: TextStyle(
            fontSize: 12,
            color: Colors.white.withOpacity(0.7),
          ),
        ),
      ],
    );
  }

  Widget _buildCircularContainer(String label) {
    return Column(
      children: [
        Container(
          width: 70,
          height: 70,
          decoration: const BoxDecoration(
            shape: BoxShape.circle,
            color: Colors.green,
          ),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: TextStyle(
            fontSize: 12,
            color: Colors.white.withOpacity(0.7),
          ),
        ),
      ],
    );
  }

  Widget _buildBorderContainer(String label, Color color, {bool dashed = false}) {
    return Column(
      children: [
        Container(
          width: 70,
          height: 70,
          decoration: BoxDecoration(
            color: color.withOpacity(0.1),
            borderRadius: BorderRadius.circular(12),
            border: Border.all(
              color: color,
              width: 2,
              style: dashed ? BorderStyle.solid : BorderStyle.solid,
            ),
          ),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: TextStyle(
            fontSize: 12,
            color: Colors.white.withOpacity(0.7),
          ),
        ),
      ],
    );
  }

  Widget _buildShadowContainer(String label, double blur, double offset) {
    return Column(
      children: [
        Container(
          width: 70,
          height: 70,
          decoration: BoxDecoration(
            color: Colors.pink,
            borderRadius: BorderRadius.circular(12),
            boxShadow: [
              BoxShadow(
                color: Colors.black.withOpacity(0.3),
                blurRadius: blur,
                offset: Offset(0, offset),
              ),
            ],
          ),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: TextStyle(
            fontSize: 12,
            color: Colors.white.withOpacity(0.7),
          ),
        ),
      ],
    );
  }

  Widget _buildGlowContainer(String label) {
    return Column(
      children: [
        Container(
          width: 70,
          height: 70,
          decoration: BoxDecoration(
            color: Colors.pink,
            borderRadius: BorderRadius.circular(12),
            boxShadow: [
              BoxShadow(
                color: Colors.pink.withOpacity(0.6),
                blurRadius: 20,
                offset: Offset.zero,
              ),
            ],
          ),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: TextStyle(
            fontSize: 12,
            color: Colors.white.withOpacity(0.7),
          ),
        ),
      ],
    );
  }

  Widget _buildCardExample() {
    return Container(
      width: double.infinity,
      padding: const EdgeInsets.all(20),
      decoration: BoxDecoration(
        gradient: const LinearGradient(
          colors: [Color(0xFF6366F1), Color(0xFF8B5CF6)],
        ),
        borderRadius: BorderRadius.circular(16),
        boxShadow: [
          BoxShadow(
            color: const Color(0xFF6366F1).withOpacity(0.4),
            blurRadius: 20,
            offset: const Offset(0, 8),
          ),
        ],
      ),
      child: const Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(
            '卡片示例',
            style: TextStyle(
              fontSize: 18,
              fontWeight: FontWeight.bold,
              color: Colors.white,
            ),
          ),
          SizedBox(height: 8),
          Text(
            '这是一个使用 Container 创建的精美卡片组件',
            style: TextStyle(
              fontSize: 14,
              color: Colors.white70,
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildButtonExample() {
    return Center(
      child: GestureDetector(
        onTap: () {},
        child: Container(
          padding: const EdgeInsets.symmetric(horizontal: 48, vertical: 16),
          decoration: BoxDecoration(
            gradient: const LinearGradient(
              colors: [Color(0xFF10B981), Color(0xFF06B6D4)],
            ),
            borderRadius: BorderRadius.circular(30),
            boxShadow: [
              BoxShadow(
                color: const Color(0xFF10B981).withOpacity(0.4),
                blurRadius: 16,
                offset: const Offset(0, 6),
              ),
            ],
          ),
          child: const Text(
            '按钮示例',
            style: TextStyle(
              fontSize: 16,
              fontWeight: FontWeight.bold,
              color: Colors.white,
            ),
          ),
        ),
      ),
    );
  }
}

十二、总结

Container 是 Flutter 中最基础也最重要的组件之一,掌握它的各种属性和用法对于构建美观的界面至关重要。

🎯 核心要点

  • decoration 是 Container 最强大的属性,通过 BoxDecoration 可以实现丰富的视觉效果
  • paddingmargin 分别控制内边距和外边距,合理使用可以创建良好的间距
  • borderRadius 可以创建从轻微圆角到完全圆形的各种形状
  • boxShadow 可以增加立体感和层次感,是提升视觉效果的关键
  • gradient 可以创建渐变背景,让界面更加生动
  • transform 可以实现旋转、缩放等变换效果
  • constraints 可以灵活控制尺寸,实现响应式布局

📚 使用建议

场景 推荐属性组合
卡片 padding + decoration (color/radius/shadow)
按钮 padding + decoration (gradient/radius/shadow) + alignment
头像 shape: circle + border + image
分隔线 height + color/decoration
背景容器 decoration (gradient) + constraints

💡 最佳实践:Container 应该作为一个独立的视觉单元使用,将相关的装饰和布局属性组合在一起,而不是作为简单的包装组件。合理使用 Container,可以让代码更加清晰,界面更加美观。

相关推荐
lqj_本人2 小时前
Flutter_Rust_Bridge:让 Flutter 稳定调用 Rust 的跨语言桥梁
harmonyos
贾伟康3 小时前
【HarmonyOS 7新能力|040】QUIC长连接工程封装:把接入逻辑放进可维护的分层结构
网络编程·harmonyos·arkts·quic·软件架构
hqzing3 小时前
Harmonybrew 仓库中的 gcc(GCC 16)和 llvm(LLVM 23)已经可用
harmonyos
用户2181697049304 小时前
Flutter ClipPath
flutter
用户2181697049307 小时前
Flutter 折叠组件 ExpansionTile ExpansionPanelList
flutter
万物智能信息科技8 小时前
PWM散热风扇设置—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
人工智能·华为·开源·harmonyos·鸿蒙
aqi0011 小时前
一文读懂 HarmonyOS 7.0 带来的十大API重要升级
android·华为·harmonyos·鸿蒙·harmony
贾伟康11 小时前
【HarmonyOS 7新能力|037】数字盾工程封装:把接入逻辑放进可维护的分层结构
安全·harmonyos·arkts·软件架构·数字签名