美文网首页Flutter
Flutter(二十四)GridView

Flutter(二十四)GridView

作者: 天色将变 | 来源:发表于2019-07-18 08:36 被阅读4次
    GridView与ListView的区别

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

    GridDelegate分类
    • SliverGridDelegateWithFixedCrossAxisCount,直接指定每行显示几个item
      • crossAxisCount,每行显示item的个数
      • mainAxisSpacing = 0.0,主轴方向上,item之间间距
      • crossAxisSpacing = 0.0,纵轴方向上,item之间的距离
      • childAspectRatio = 1.0,纵轴item的高度=childAspectRatio*横轴的item长度
    • SliverGridDelegateWithMaxCrossAxisExtent,指定每个item的最大长度,然后计算出每行显示item的个数。
      • maxCrossAxisExtent,限定每个item最大长度。比如屏幕宽400,最大长度限定300和限定是100时,每行显示个数肯定是不同的,具体多少需要计算。
      • mainAxisSpacing = 0.0,主轴方向上,item之间间距
      • crossAxisSpacing = 0.0,纵轴方向上,item之间的距离
      • childAspectRatio = 1.0,纵轴item的高度=childAspectRatio*横轴的item长度
    构造方法
    • 默认构造方法GridView(),显示少量数据,一次性全部绘制。内部可以指定使用那个GridDelegate。
    • GridView.count(),在默认构造方法基础上,指定使用了SliverGridDelegateWithFixedCrossAxisCount
    • GridView.extent(),在默认构造方法基础上,指定使用了SliverGridDelegateWithMaxCrossAxisExtent
    • GridView.builder(),适合大量数据,懒加载形式。可以指定使用哪个GridDelegate,并提供itemBuilder构建每个item的widget
    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),
                ),
              );
            },
          ),
        );
      }
    }
    

    相关文章

      网友评论

        本文标题:Flutter(二十四)GridView

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