美文网首页
flutter 动手篇3 - 流式布局

flutter 动手篇3 - 流式布局

作者: charmingcheng | 来源:发表于2019-04-12 16:02 被阅读0次

    流式布局

    Wrap

    在介绍Row和Colum时,如果子widget超出屏幕范围,则会报溢出错误,如:

    Row(
      children: <Widget>[
        Text("xxx"*100)
      ],
    );
    
    

    运行:

    image-20180905171113290

    可以看到,右边溢出部分报错。这是因为Row默认只有一行,如果超出屏幕不会折行。我们把超出屏幕显示范围会自动折行的布局称为流式布局。Flutter中通过Wrap和Flow来支持流式布局,将上例中的Row换成Wrap后溢出部分则会自动折行。下面是Wrap的定义:

    Wrap({
      ...
      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,
      this.verticalDirection = VerticalDirection.down,
      List<Widget> children = const <Widget>[],
    })
    
    

    我们可以看到Wrap的很多属性在Row(包括Flex和Column)中也有,如direction、crossAxisAlignment、textDirection、verticalDirection等,这些参数意义是相同的,我们不再重复介绍,读者可以查阅前面介绍Row的部分。读者可以认为Wrap和Flex(包括Row和Column)除了超出显示范围后Wrap会折行外,其它行为基本相同。下面我们看一下Wrap特有的几个属性:

    • spacing:主轴方向子widget的间距
    • runSpacing:纵轴方向的间距
    • runAlignment:纵轴方向的对齐方式

    下面看一个示例子:

    import 'package:flutter/material.dart';
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Wrap',
          theme: new ThemeData(
            primarySwatch: Colors.lightBlue,
          ),
          home: new MyHome(),
        );
      }
    }
    
    class MyHome extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: AppBar(
              title: Text("Wrap", style: TextStyle(color: Colors.white))
          ),
          body: Wrap(
            spacing: 8.0, //主轴(水平)方向间距
            runSpacing: 4.0, //纵轴(垂直)方向间距
            alignment: WrapAlignment.center,  //沿主轴方向居中
            children: <Widget>[
              Chip(
                avatar: CircleAvatar(
                  backgroundColor: Colors.amber,
                  child: Text('A'),
                ),
                label: Text('Hamilton'),
              ),
              Chip(
                avatar: CircleAvatar(
                  backgroundColor: Colors.blue,
                  child: Text('M'),
                ),
                label: Text('Lafayette'),
              ),
              Chip(
                avatar: CircleAvatar(
                  backgroundColor: Colors.green,
                  child: Text('H'),
                ),
                label: Text('Mulligan'),
              ),
              Chip(
                avatar: CircleAvatar(
                  backgroundColor: Colors.pink,
                  child: Text('J'),
                ),
                label: Text('Laurens'),
              )
            ],
          ),
        );
      }
    }
    
    

    效果展示//


    image.png

    相关文章

      网友评论

          本文标题:flutter 动手篇3 - 流式布局

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