美文网首页
Flutter 之 流式布局(Wrap、Flow)

Flutter 之 流式布局(Wrap、Flow)

作者: yanshihao | 来源:发表于2020-11-30 09:55 被阅读0次

    流式布局

    流式布局在移动端是非常常见的,比如商品列表,瀑布流、标签页等等
    Flutter 中提供了两种流式布局Wrap和Flow

    Wrap

    Wrap可以进行水平方向或者垂直方向上的布局,在一行或者一列现实不完所有的widgets的时候,能够根据当前宽度或者高度自动换行。

     Wrap({
        Key key,
        this.direction = Axis.horizontal,   //排列方向,默认水平方向排列
        this.alignment = WrapAlignment.start,  //子控件在主轴上的对齐方式
        this.spacing = 0.0,  //主轴上子控件中间的间距
        this.runAlignment = WrapAlignment.start,  //子控件在交叉轴上的对齐方式
        this.runSpacing = 0.0,  //交叉轴上子控件之间的间距
        this.crossAxisAlignment = WrapCrossAlignment.start,   //交叉轴上子控件的对齐方式
        this.textDirection,   //textDirection水平方向上子控件的起始位置
        this.verticalDirection = VerticalDirection.down,  //垂直方向上子控件的其实位置
        List<Widget> children = const <Widget>[],   //要显示的子控件集合
      })
    

    注意

    image.png
    image.png

    alignment 不管设置什么属性都不能调整第一行的位置
    包裹一个Container来看,当前Wrap没有占满全屏


    image.png
    return Container(
          color: Colors.red,
          width: double.infinity,
          child: Wrap(
            spacing: 10,
            runSpacing: 30,
            runAlignment: WrapAlignment.end,
            alignment: WrapAlignment.spaceAround,
            children: [
              MyButton("第一季"),
              MyButton("第二季"),
              MyButton("第一季长度不一样"),
              MyButton("第三季"),
              MyButton("第四季"),
              MyButton("第五季"),
              MyButton("第六季"),
              MyButton("第六季"),
              MyButton("第六季"),
              MyButton("第六季"),
              MyButton("第六季"),
              MyButton("第六季"),
            ],
          ),
    

    把Container占满全屏才表现下面效果


    image.png

    Flow

    我们一般很少会使用Flow,因为其过于复杂,需要自己实现子组件的位置转换,所以在很多场景下首先要考虑的是Wrap是否满足需求。Flow主要用于一些需要自定义布局策略或性能要求较高(如动画中)的场景。

    Flow({
        Key key,
        @required this.delegate,
        List<Widget> children = const <Widget>[],
      }) 
    
    class MyFlowDelegate extends FlowDelegate {
    
      @override
      void paintChildren(FlowPaintingContext context) {
        //计算每一个子widget的位置
        for (int i = 0; i < context.childCount; i++) {
        
        }
    
      }
    
      @override
      bool shouldRepaint(covariant FlowDelegate oldDelegate) {
        return oldDelegate != this;
      }
    
      @override
      getSize(BoxConstraints constraints){
        //指定Flow的大小
        return Size(double.infinity,200.0);
      }
    
    }
    

    相关文章

      网友评论

          本文标题:Flutter 之 流式布局(Wrap、Flow)

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