Flutter常用widget “Container”

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

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
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。其中的转换过程为:

 /// 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具体怎么操作的这三个值的呢?举两个例子:

  int origen = 10;
  int result = origen.clamp(2, 11);
  print(result);//结果为10
  int origen = 10;
  int result = origen.clamp(2, 9);
  print(result);//结果为9

常规部分

  • alignment 对齐方式
    这个类里默认有几个常量,container可以理解为一个矩形,而这些常量分别代表container中的九个位置,如图所示
    《Flutter常用widget “Container”》 九个常量示意图
    如果除了这九个位置,想要自己随心所欲的放置child则可以用:
const Alignment(this.x, this.y)
    : assert(x != null),
      assert(y != null);

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

《Flutter常用widget “Container”》 坐标系示意图

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

  • ‘padding’和margin
    这两个的含义想必是不用多说了,就说说怎么用吧
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()方法,下面是它的源码:

 const EdgeInsets.only({
    this.left: 0.0,
    this.top: 0.0,
    this.right: 0.0,
    this.bottom: 0.0
  });
const EdgeInsets.all(double value)
      : left = value, top = value, right = value, bottom = value;
  • foregroundDecoration 顾名思义,这是画在child上面的装饰物
  • transform 矩阵变化,注意:这个参数会应用在Container绘制之前
    transform对应一个Matrix4对象,这里面也有一些常用的实现,比如旋转,平移之类的
    原文作者:坑吭吭
    原文地址: https://www.jianshu.com/p/8bacb381bbc2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞