小菜鸡开始学习flutter之二十二

32 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

今日目标

今天来学习前两天剩下的最后一种布局,网格布局,主要用于商品布局中。今天主要学习两种常用的,GridView.count实现网格布局,GridView.builder实现网格布局。

GridView常用属性

名称类型说明
scrollDirectionAxis滚动方法
paddingEdgeInsets内边距
resolvebol组件反向排序
crossAxisSpacingdouble水平子Widget之间间距
mainAxisSpacingdouble垂直子Widget之间间距
crossAxisCountint一行Widget数量
childAspectRationdouble子Widget宽高比例
children*[]
gridDelegateSliverGridelgateWithFixedCrossAxisCount
SliverGridDelegateWithMaxCrossAxisExtent
控制布局主要用在GridView.builder里面

GridView.count

class HomeContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GridView.count(
      children: <Widget>[
        Text('this is line 1'),
        Text('this is line 1'),
        Text('this is line 1'),
        Text('this is line 1'),
        Text('this is line 1'),
      ],
      crossAxisCount: 3,
    );
  }
}

image.png 如上,我们就很快速的实现了一个简单的网格布局\

class HomeContent extends StatelessWidget {
  List<Widget> _getListData() {
    List<Widget> list = [];
    for (var i = 0; i < 20; i++) {
      list.add(Container(
        alignment: Alignment.center,
        child: Text(
          '这是第$i条数据',
          style: TextStyle(color: Colors.red[500], fontSize: 12 + i*1.0),
        ),
        color: Colors.blue[i * 100],
        // height: 20.0, // 这里设置高度是没有效果的
      ));
    }
    return list;
  }

  @override
  Widget build(BuildContext context) {
    return GridView.count(
      children: this._getListData(),
      crossAxisCount: 3, // 控制一行有多少个Widget
      crossAxisSpacing: 20.0,
      mainAxisSpacing: 10.0,
      padding: EdgeInsets.all(10.0),
      childAspectRatio: 0.7,
    );
  }
}

image.png
结合我们之前学习的动态列表的实现,我们很轻松的就得到一个动态的网格样式。 如果我们直接对Container设置高度height属性是没有效果的,高度由子元素来决定或者通过childAspectRation属性来设置

GridView.builder

class HomeContent extends StatelessWidget {
  Widget _getListData(context, i) {
    return Container(
      alignment: Alignment.center,
      child: Text(
        '这是第$i条数据',
        style: TextStyle(
            color: Colors.red[500], fontSize: (12 + i * 1.0).toDouble()),
      ),
      color: Colors.blue[i * 100],
      // height: 20.0, // 这里设置高度是没有效果的
    );
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return GridView.builder(
      itemCount: 20,
      itemBuilder: _getListData,
      padding: EdgeInsets.all(10.0),
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3, mainAxisSpacing: 10.0, crossAxisSpacing: 10.0),
    );
  }
}

image.png
如上我们就通过builder方式实现了网格布局,要注意gridDelegate这个属性对应的方法。
其实相信大家也发现了,不管ListView还是GridView基本实现起来都是差不多的形式,大家只需要基本记住里面常用的一些属性就好了。

ending

持续学习如有错误的地方还请指正谢谢