flutter 动手篇3 - 流式布局

流式布局

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 本文的目的是为了让读者掌握不同布局类Widget的布局特点,分享一些在实际使用过程遇到的一些问题,在《Flu...
    xqqlv阅读 5,475评论 0赞 18
  • 流式布局 Wrap 在介绍Row和Colum时,如果子widget超出屏幕范围,则会报溢出错误,如: 可以看到,右...
    CQ_TYL阅读 4,195评论 0赞 8
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,392评论 1赞 92
  • 原文在此,这里只为学习 流式布局Wrap 在介绍Row和Colum时,如果子widget超出屏幕范围,则会报溢出错...
    lltree阅读 1,062评论 0赞 0
  • 目录 1.Dart语法 2.Flutter工程目录 3.Widget简介 4.常用Widget介绍 5.实战 先看...
    慕涵盛华阅读 3,790评论 0赞 16

友情链接更多精彩内容