前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter常用widget “Container”

Flutter常用widget “Container”

作者头像
坑吭吭
发布2018-08-31 17:25:07
1K0
发布2018-08-31 17:25:07
举报

首先还是先看看构造方法里都有哪些参数

代码语言:javascript
复制
Container({
    Key key,
    this.alignment,
    this.padding,
    Color color,
    Decoration decoration,
    this.foregroundDecoration,
    double width,
    double height,
    BoxConstraints constraints,
    this.margin,
    this.transform,
    this.child,
  }) : assert(margin == null || margin.isNonNegative),
       assert(padding == null || padding.isNonNegative),
       assert(decoration == null || decoration.debugAssertIsValid()),
       assert(constraints == null || constraints.debugAssertIsValid()),
       assert(color == null || decoration == null,
         'Cannot provide both a color and a decoration\n'
         'The color argument is just a shorthand for "decoration: new BoxDecoration(color: color)".'
       ),
       decoration = decoration ?? (color != null ? new BoxDecoration(color: color) : null),
       constraints =
        (width != null || height != null)
          ? constraints?.tighten(width: width, height: height)
            ?? new BoxConstraints.tightFor(width: width, height: height)
          : constraints,
       super(key: key);

先来看特殊的部分:

  • 这里有一大块内容是来描述Colordecoration的。根据源码中的注释,这俩参数是不能同时赋值的,color参数本身就是new BoxDecoration(color: color)的简写方式。不管是给color赋值还是给decoration赋值,最终都将会影响到decoration,如果两个参数都没有赋值的话则decorationnull
  • 接下来就是BoxConstraints constraints参数 如果widthheight都没有定义的话,则constraints就取它自己本身的值,如果constraints也没赋值,就为null。 如果constraints没有赋值,只写了width(或height),则会直接创建一个尽可能小的BoxConstraint
代码语言:javascript
复制
const BoxConstraints.tightFor({
    double width,
    double height
  }): minWidth = width != null ? width : 0.0,
      maxWidth = width != null ? width : double.infinity,
      minHeight = height != null ? height : 0.0,
      maxHeight = height != null ? height : double.infinity;

如果constraintswidth(或height)同时有值的时候,则根据两者的约束重新生成一个尽可能符合两者的BoxConstraints。其中的转换过程为:

代码语言:javascript
复制
 /// Returns new box constraints with a tight width and/or height as close to
  /// the given width and height as possible while still respecting the original
  /// box constraints.
  BoxConstraints tighten({ double width, double height }) {
    return new BoxConstraints(minWidth: width == null ? minWidth : width.clamp(minWidth, maxWidth),
                              maxWidth: width == null ? maxWidth : width.clamp(minWidth, maxWidth),
                              minHeight: height == null ? minHeight : height.clamp(minHeight, maxHeight),
                              maxHeight: height == null ? maxHeight : height.clamp(minHeight, maxHeight));
  }

关键是clamp方法,clamp具体怎么操作的这三个值的呢?举两个例子:

代码语言:javascript
复制
  int origen = 10;
  int result = origen.clamp(2, 11);
  print(result);//结果为10
代码语言:javascript
复制
  int origen = 10;
  int result = origen.clamp(2, 9);
  print(result);//结果为9

常规部分

  • alignment 对齐方式 这个类里默认有几个常量,container可以理解为一个矩形,而这些常量分别代表container中的九个位置,如图所示

九个常量示意图 如果除了这九个位置,想要自己随心所欲的放置child则可以用:

代码语言:javascript
复制
const Alignment(this.x, this.y)
    : assert(x != null),
      assert(y != null);

这里的x和y可以看做一个坐标系,如图所示:

坐标系示意图

矩形部分代表container,中心部分为坐标系原点,原点到各个边的距离都是1,则根据比例,你可以把child放到任何你想要放的位置

  • 'padding'和margin 这两个的含义想必是不用多说了,就说说怎么用吧
代码语言:javascript
复制
new Center(
  child: new Container(
    margin: const EdgeInsets.all(10.0),
    color: const Color(0xFF00FF00),
    width: 48.0,
    height: 48.0,
  ),
)

一般会对应实现一个EdgeInsets对象,如果只需要对某个边进行paddingmargin,或者四个边的值不一样的话,需要调用EdgeInsets.only()方法,如果四个边的值一样的话可以直接用EdgeInsets.all()方法,下面是它的源码:

代码语言:javascript
复制
 const EdgeInsets.only({
    this.left: 0.0,
    this.top: 0.0,
    this.right: 0.0,
    this.bottom: 0.0
  });
代码语言:javascript
复制
const EdgeInsets.all(double value)
      : left = value, top = value, right = value, bottom = value;
  • foregroundDecoration 顾名思义,这是画在child上面的装饰物
  • transform 矩阵变化,注意:这个参数会应用在Container绘制之前 transform对应一个Matrix4对象,这里面也有一些常用的实现,比如旋转,平移之类的
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先来看特殊的部分:
  • 常规部分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档