美文网首页Flutter学习日记
Flutter常用widget “Container”

Flutter常用widget “Container”

作者: 坑吭吭 | 来源:发表于2018-07-19 16:39 被阅读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);
    

    先来看特殊的部分:

    • 这里有一大块内容是来描述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中的九个位置,如图所示
      九个常量示意图
      如果除了这九个位置,想要自己随心所欲的放置child则可以用:
    const Alignment(this.x, this.y)
        : assert(x != null),
          assert(y != null);
    

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

    坐标系示意图
    矩形部分代表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对象,这里面也有一些常用的实现,比如旋转,平移之类的

    相关文章

      网友评论

        本文标题:Flutter常用widget “Container”

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