Flutter学习日记

Flutter常用widget “Container”

2018-07-19  本文已影响13人  坑吭吭

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

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);

先来看特殊的部分:

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

常规部分

const Alignment(this.x, this.y)
    : assert(x != null),
      assert(y != null);

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

坐标系示意图
矩形部分代表container,中心部分为坐标系原点,原点到各个边的距离都是1,则根据比例,你可以把child放到任何你想要放的位置
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;
上一篇 下一篇

猜你喜欢

热点阅读