美文网首页
Flutter 容器组件(Container)

Flutter 容器组件(Container)

作者: wuchao226 | 来源:发表于2019-06-17 11:01 被阅读0次

容器组件(Container)

容器组件(Container)包含一个子 Widget,自身具备如 alignment、padding 等基础属性,方便布局过程中摆放 child。

Container 组件常用属性见下表:

属性名 类型 说明
key Key Container 唯一标识符,用于查找更新
alignment AlignmentGeometry 控制 child 的对齐方式,如果 Container 或者 Container 父节点尺寸大于 child 的尺寸,这个属性设置会起作用,有很多种对齐方式
padding EdgelnsetsGeometry Decoration 内部的空白区域,如果有 child 的话, child 位于 padding 内部
color Color 用来设置 Container 背景色,如果 foregroundDecoration 设置的话,可能会遮盖 color 效果
decoration Decoration 绘制在 child 后面的装饰,设置了 Decoration 的话,就不能设 置 color 属性,否则会报错,此时应该在 Decoration 中进行颜色的设置
foregroundDecoration Decoration 绘制在 child前面的装饰
width double Container 的宽度,设置为 double.infinity 可以强制在宽度上撑满,不设置, 则根据 child 和父节点两者一起布局
height double Container 的高度,设置为 double.infinity 即可以强制在高度上撑满
constraints BoxConstraints 添加到 child 上额外的约束条件
margin EdgelnsetsGeometry 围绕在 Decoration 和 child 之外的空白区域,不属于内容区域
transform Matrix4 设置 Container 的变换矩阵,类型为 Matrix4
child Widget Container 中的内容 Widget

padding 与 margin 的不同之处在于, padding 是包含在 Content 内 ,而 margin 是外部边界。设置点击事件的话 , padding 区域会响应 , 而 margin 区域不会响应 。

有两点需要说明:

  • 容器的大小可以通过 width、height 属性来指定,也可以通过 constraints 来指定,如果同时存在时,width、height 优先。实际上 Container 内部会根据width、height 来生成一个constraints。
  • color 和 decoration 是互斥的,实际上,当指定 color 时,Container 内会自动创建一个 decoration。

接下来我们编写一个带有装饰效果的 Container容器组件示例,示例代码 如下:

import ’package:flutter/material.dart ’; 

void main() => runApp(ContainerTest());
class ContainerTest extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 我们想使用 material 风格的应用,所以这里用 MaterialApp
    return MaterialApp(
      // 移动设备使用这个 title 来表示我们的应用。具体一点说,在 Android 设备里,我们点击
      // recent 按钮打开最近应用列表的时候,显示的就是这个 title。
      title: '容器组件示例',
      home: Scaffold(
        appBar: AppBar(
          title: Text('容器组件示例'),
          centerTitle: true,
        ),
        body: Column(
          children: <Widget>[
            //添加容器
            Container(
              margin: EdgeInsets.only(top: 20, left: 120),
              width: 200,
              height: 200,
              //添加边框装饰效果
              decoration: BoxDecoration(
                color: Colors.white,
                //设置上下左右四个边框样式
                border: Border.all(
                  //边框颜色
                  color: Colors.grey,
                  //边框粗细
                  width: 8,
                ),
                //边框弧度
                borderRadius: const BorderRadius.all(const Radius.circular(8)),
              ),
              //容器内文字居中
              alignment: Alignment.center,
              child: Text(
                'Flutter',
                //textAlign: TextAlign.center,
                style: TextStyle(fontSize: 28),
              ),
            ),
            Container(
              //容器外补白
              margin: EdgeInsets.only(top: 50, left: 120),
              //卡片大小
              constraints: BoxConstraints.tightFor(width: 200, height: 150),
              decoration: BoxDecoration(
                //背景径向渐变
                gradient: RadialGradient(
                  colors: [Colors.red, Colors.orange],
                  center: Alignment.topLeft,
                  radius: .98,
                ),
                //卡片阴影
                boxShadow: [
                  BoxShadow(
                    color: Colors.black54,
                    offset: Offset(2.0, 2.0),
                    blurRadius: 4,
                  ),
                ],
              ),
              //卡片倾斜变换
              transform: Matrix4.rotationZ(.2),
              //卡片内文字居中
              alignment: Alignment.center,
              //卡片文字
              child: Text(
                '5.20',
                style: TextStyle(color: Colors.white, fontSize: 40),
              ),
            )
          ],
        ),
      ),
    );
  }
}

上述示例代码视图展现大致如下图所示。


接下来我们看一个用 Container进行容器布局的综合小例子,完整的示例代码如下 :

import 'package:flutter/material.dart';

import 'ContainerTest.dart';

void main() => runApp(MyApp());

// 这个 widget 作用这个应用的顶层 widget.
//这个 widget 是无状态的,所以我们继承的是 [StatelessWidget].
//对应的,有状态的 widget 可以继承 [StatefulWidget]
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 我们想使用 material 风格的应用,所以这里用 MaterialApp
    return MaterialApp(
      // 移动设备使用这个 title 来表示我们的应用。具体一点说,在 Android 设备里,我们点击
      // recent 按钮打开最近应用列表的时候,显示的就是这个 title。
      title: 'Welcome to Flutter',
      // 应用的“主页”
      home: ContainerTest(),
    );
  }
}


class ContainerTest extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //返回一个Container 对象
    Widget container = Container(
      //添加装饰效果
      decoration: BoxDecoration(
        color: Colors.grey,
      ),
      //子元素指定为一个垂直水平嵌套布局的组件
      child: Column(
        children: <Widget>[
          Row(
            children: <Widget>[
              //使用Expanded防止内容溢出
              Expanded(
                child: Container(
                  width: 150,
                  height: 150,
                  //添加边框样式
                  decoration: BoxDecoration(
                    //上下左右边框设置为宽度 10,颜色为蓝灰色
                    border: Border.all(width: 10, color: Colors.blueGrey),
                    //上下左右边框弧度设置为 8.0
                    borderRadius:
                        const BorderRadius.all(const Radius.circular(8)),
                  ),
                  //上下左右增加边距
                  margin: const EdgeInsets.all(4),
                  //添加图片
                  child: Image.asset("images/avator.png"),
                ),
              ),
              Expanded(
                child: Container(
                  width: 150,
                  height: 150,
                  //添加边框样式
                  decoration: BoxDecoration(
                    //上下左右边框设置为宽度 10,颜色为蓝灰色
                    border: Border.all(width: 10, color: Colors.blueGrey),
                    //上下左右边框弧度设置为 8.0
                    borderRadius:
                        const BorderRadius.all(const Radius.circular(8)),
                  ),
                  //上下左右增加边距
                  margin: const EdgeInsets.all(4),
                  //添加图片
                  child: Image.asset("images/avator.png"),
                ),
              ),
            ],
          ),
          Row(
            children: <Widget>[
              //使用Expanded防止内容溢出
              Expanded(
                child: Container(
                  width: 150,
                  height: 150,
                  //添加边框样式
                  decoration: BoxDecoration(
                    //上下左右边框设置为宽度 10,颜色为蓝灰色
                    border: Border.all(width: 10, color: Colors.blueGrey),
                    //上下左右边框弧度设置为 8.0
                    borderRadius:
                        const BorderRadius.all(const Radius.circular(8)),
                  ),
                  //上下左右增加边距
                  margin: const EdgeInsets.all(4),
                  //添加图片
                  child: Image.asset("images/avator.png"),
                ),
              ),
              Expanded(
                child: Container(
                  width: 150,
                  height: 150,
                  //添加边框样式
                  decoration: BoxDecoration(
                    //上下左右边框设置为宽度 10,颜色为蓝灰色
                    border: Border.all(width: 10, color: Colors.blueGrey),
                    //上下左右边框弧度设置为 8.0
                    borderRadius:
                        const BorderRadius.all(const Radius.circular(8)),
                  ),
                  //上下左右增加边距
                  margin: const EdgeInsets.all(4),
                  //添加图片
                  child: Image.asset("images/avator.png"),
                ),
              ),
            ],
          ),
        ],
      ),
    );
    return Scaffold(
      appBar: AppBar(
        title: Text('Container 布局容器示例'),
        centerTitle: true,
      ),
      body: container,
    );
  }
}

上述示例代码的视图展现大致如下图所示。


相关文章

网友评论

      本文标题:Flutter 容器组件(Container)

      本文链接:https://www.haomeiwen.com/subject/nmrgfctx.html