Flutter

Flutter(二十四)GridView

2019-07-18  本文已影响4人  天色将变
GridView与ListView的区别

以垂直方向为例,GridView每行可以展示多个item,ListView每行只能显示1个item。因此GridView属性中多来了gridDelegate,主要用于计算每行显示item的算法。

GridDelegate分类
构造方法
image.png
默认构造方法
class _MyHomePageState2 extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    List<String> list = <String>[];
    for (var i = 0; i < 150; i++) {
      list.add(i.toString());
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: GridView(
        scrollDirection: Axis.vertical, // 滚动方向
        cacheExtent: 40, // 在超出边界指定值内,缓存item
        shrinkWrap: true,
        padding: EdgeInsets.all(10),
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 4, //主轴方向上,展示item的个数
            mainAxisSpacing:
                10, // 主轴方向上,item之间间距  通过crossAxisCount和mainAxisSpacing就能确定主轴方向item的长度
            crossAxisSpacing: 10, // 纵轴方向上,item之间的距离
            childAspectRatio: 1.5), //纵轴的高度=childAspectRatio*横轴的长度
        children: list
            .map((item) => Container(
                  color: Colors.red[200],
                  child: Text(
                    item,
                    style: TextStyle(fontSize: 16),
                  ),
                ))
            .toList(),
      ),
    );
  }
}
GridView.count()
class _MyHomePageState3 extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    List<String> list = <String>[];
    for (var i = 0; i < 150; i++) {
      list.add(i.toString());
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: GridView.count(
        scrollDirection: Axis.vertical, // 滚动方向
        cacheExtent: 40, // 在超出边界指定值内,缓存item
        shrinkWrap: true,
        padding: EdgeInsets.all(10),
        crossAxisCount: 4, //主轴方向上,展示item的个数
        mainAxisSpacing:
            10, // 主轴方向上,item之间间距  通过crossAxisCount和mainAxisSpacing就能确定主轴方向item的长度
        crossAxisSpacing: 10, // 纵轴方向上,item之间的距离
        childAspectRatio: 1.5, //纵轴的高度=childAspectRatio*横轴的长度

        children: list
            .map((item) => Container(
                  color: Colors.red[200],
                  child: Text(
                    item,
                    style: TextStyle(fontSize: 16),
                  ),
                ))
            .toList(),
      ),
    );
  }
}
GridView.extent()
class _MyHomePageState4 extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    List<String> list = <String>[];
    for (var i = 0; i < 150; i++) {
      list.add(i.toString());
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: GridView.extent(
        scrollDirection: Axis.vertical, // 滚动方向
        shrinkWrap: true,
        padding: EdgeInsets.all(10),
        maxCrossAxisExtent: 100, //主轴方向上,限定来1个item的最大显示长度,实际长度还是要经过计算,显示个数肯定是个整数,并且均分长度
        mainAxisSpacing:
        10, // 主轴方向上,item之间间距  通过crossAxisCount和mainAxisSpacing就能确定主轴方向item的长度
        crossAxisSpacing: 10, // 纵轴方向上,item之间的距离
        childAspectRatio: 1.5, //纵轴的高度=childAspectRatio*横轴的长度

        children: list
            .map((item) => Container(
          color: Colors.red[200],
          child: Text(
            item,
            style: TextStyle(fontSize: 16),
          ),
        ))
            .toList(),
      ),
    );
  }
}
GridView.builder()
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    List<String> list = <String>[];
    for (var i = 0; i < 150; i++) {
      list.add(i.toString());
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: GridView.builder(
        scrollDirection: Axis.vertical, // 滚动方向
        cacheExtent: 40, // 在超出边界指定值内,缓存item
        shrinkWrap: true,
        padding: EdgeInsets.all(10),
        itemCount: list.length,
        gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
            maxCrossAxisExtent: 154, //主轴方向上,展示item的个数
            mainAxisSpacing:
            10, // 主轴方向上,item之间间距  通过crossAxisCount和mainAxisSpacing就能确定主轴方向item的长度
            crossAxisSpacing: 10, // 纵轴方向上,item之间的距离
            childAspectRatio: 1.5), //纵轴的高度=childAspectRatio*横轴的长度
        itemBuilder: (BuildContext context, int index) {
          print(index.toString());
          return Container(
            color: Colors.red[200],
            child: Text(
              list[index],
              style: TextStyle(fontSize: 16),
            ),
          );
        },
      ),
    );
  }
}
上一篇下一篇

猜你喜欢

热点阅读