美文网首页
Flutter开发 -- [10 - GridView]

Flutter开发 -- [10 - GridView]

作者: happy神悦 | 来源:发表于2020-11-16 09:25 被阅读0次

    一. GridView组件

    GridView用于展示多列的展示,在开发中也非常常见,比如直播App中的主播列表、电商中的商品列表等等。

    在Flutter中我们可以使用GridView来实现,使用方式和ListView也比较相似。

    1.1. GridView构造函数

    我们先学习GridView构造函数的使用方法

    一种使用GridView的方式就是使用构造函数来创建,和ListView对比有一个特殊的参数:gridDelegate

    gridDelegate用于控制交叉轴的item数量或者宽度,需要传入的类型是SliverGridDelegate,但是它是一个抽象类,所以我们需要传入它的子类:

    SliverGridDelegateWithFixedCrossAxisCount

    SliverGridDelegateWithFixedCrossAxisCount({
      @required double crossAxisCount, // 交叉轴的item个数
      double mainAxisSpacing = 0.0, // 主轴的间距
      double crossAxisSpacing = 0.0, // 交叉轴的间距
      double childAspectRatio = 1.0, // 子Widget的宽高比
    })
    

    代码演练:

    class MyGridCountDemo extends StatelessWidget {
    
      List<Widget> getGridWidgets() {
        return List.generate(100, (index) {
          return Container(
            color: Colors.purple,
            alignment: Alignment(0, 0),
            child: Text("item$index", style: TextStyle(fontSize: 20, color: Colors.white)),
          );
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return GridView(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 3,
            mainAxisSpacing: 10,
            crossAxisSpacing: 10,
            childAspectRatio: 1.0
          ),
          children: getGridWidgets(),
        );
      }
    }
    

    SliverGridDelegateWithMaxCrossAxisExtent

    SliverGridDelegateWithMaxCrossAxisExtent({
      double maxCrossAxisExtent, // 交叉轴的item宽度
      double mainAxisSpacing = 0.0, // 主轴的间距
      double crossAxisSpacing = 0.0, // 交叉轴的间距
      double childAspectRatio = 1.0, // 子Widget的宽高比
    })
    

    代码演练:

    class MyGridExtentDemo extends StatelessWidget {
    
      List<Widget> getGridWidgets() {
        return List.generate(100, (index) {
          return Container(
            color: Colors.purple,
            alignment: Alignment(0, 0),
            child: Text("item$index", style: TextStyle(fontSize: 20, color: Colors.white)),
          );
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return GridView(
          gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
            maxCrossAxisExtent: 150,
            mainAxisSpacing: 10,
            crossAxisSpacing: 10,
            childAspectRatio: 1.0
          ),
          children: getGridWidgets(),
        );
      }
    }
    

    前面两种方式也可以不设置delegate

    可以分别使用:GridView.count构造函数GridView.extent构造函数实现相同的效果,这里不再赘述。

    1.2. GridView.build

    和ListView一样,使用构造函数会一次性创建所有的子Widget,会带来性能问题,所以我们可以使用GridView.build来交给GridView自己管理需要创建的子Widget。

    我们直接使用之前的数据来进行代码演练:

    class _GridViewBuildDemoState extends State<GridViewBuildDemo> {
      List<Anchor> anchors = [];
    
      @override
      void initState() {
        getAnchors().then((anchors) {
          setState(() {
            this.anchors = anchors;
          });
        });
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Padding(
          padding: const EdgeInsets.all(8.0),
          child: GridView.builder(
            shrinkWrap: true,
            physics: ClampingScrollPhysics(),
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              mainAxisSpacing: 10,
              crossAxisSpacing: 10,
              childAspectRatio: 1.2
            ),
            itemCount: anchors.length,
            itemBuilder: (BuildContext context, int index) {
              return Container(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Image.network(anchors[index].imageUrl),
                    SizedBox(height: 5),
                    Text(anchors[index].nickname, style: TextStyle(fontSize: 16),),
                    Text(anchors[index].roomName, maxLines: 1, overflow: TextOverflow.ellipsis,)
                  ],
                ),
              );
            }
          ),
        );
      }
    }
    

    相关文章

      网友评论

          本文标题:Flutter开发 -- [10 - GridView]

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