flutter 实战 之 GridView

马肤
这是懒羊羊

GridView 和 ListView 是 Flutter 中用于构建滚动列表的两种常见小部件。它们之间的主要区别在于它们的布局方式和如何显示其子小部件。

  1. 布局方式:

  2. 子小部件排列:

  3. 子小部件数量:

  4. 适用场景:

下面展示一个简单网格布局

 代码实现也很简单

Widget build(BuildContext context) {
    return GridView.count(crossAxisCount: 3,
      children: [
        Icon(ItyingFont.icon1,color: Colors.green,),
        Icon(ItyingFont.icon2,color: Colors.amberAccent,),
        Icon(ItyingFont.icon3,color: Colors.blue,),
        Icon(Icons.add,color:Colors.pink,),
        Icon(Icons.access_time,color: Colors.purple,),
        Icon(Icons.add_alert_sharp,color: Colors.cyanAccent,),
        Icon(Icons.ac_unit,color: Colors.cyanAccent,),
        Icon(Icons.access_time_outlined,color: Colors.amber,),
        Icon(Icons.access_time_filled,color: Colors.deepPurpleAccent,),
      ],
    );
  }

crossAxisCount 是列组件的数量,由自己定义,再用children来装载内容

上面这个代码是通过GridView.count 来实现,下面用GridView.extent来实现,与GridView.count不同的是 GridView.extent 通过 maxCrossAxisExtent (组件的最大长度)来控制一行有多少个组件

 

Widget build(BuildContext context) {
    return GridView.extent(maxCrossAxisExtent: 150.0,   //每个组件的最大长度
      children: [
      Icon(ItyingFont.icon1,color: Colors.green,),
    Icon(ItyingFont.icon2,color: Colors.amberAccent,),
    Icon(ItyingFont.icon3,color: Colors.blue,),
    Icon(Icons.add,color:Colors.pink,),
    Icon(Icons.access_time,color: Colors.purple,),
    Icon(Icons.add_alert_sharp,color: Colors.cyanAccent,),
    Icon(Icons.ac_unit,color: Colors.cyanAccent,),
    Icon(Icons.access_time_outlined,color: Colors.amber,),
    Icon(Icons.access_time_filled,color: Colors.deepPurpleAccent,),
      ],
    );
  }

那如果要实现下面的效果呢?

 用 GridView.count 怎么实现呢,看代码

 

class Page extends StatelessWidget {
  Page({Key? key}) : super(key: key);
  List _initGridViewData() {
    List temlist = [];
    for (var i = 0; i  
那要是用 GridView.extend 呢
@override
  Widget build(BuildContext context) {
    return GridView.extent(
        padding: EdgeInsets.all(10),
        //每个组件的最大长度
        maxCrossAxisExtent: 120,
        //水平子 Widget 之间的间距
        crossAxisSpacing: 10.0,
        //垂直子 Widget 之间的间距
        mainAxisSpacing: 10.0,
        // 宽高比
        childAspectRatio: 0.7,
        children: _initGridViewData());
  }
如何实现下面的效果呢

 看看代码如下

 

import 'package:flutter/material.dart';
// import 'package:hive/hive.dart';
import 'package:pivot_chat/widgets/button/_PCHomePageButton.dart';
class test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          leading: IconButton(
            onPressed: () {},
            icon: Icon(
              ItyingFont.icon1,
              color: Colors.pinkAccent,
            ),
          ),
        ),
        body: Page(),
      ),
    );
  }
}
class Page extends StatelessWidget {
  Page({Key? key}) : super(key: key);
  Widget _initGridViewData(context ,int  index) {
      return Container(
          height: 200,
        // 设置一个 外边框
          decoration: BoxDecoration(
            border: Border.all(
              color: Colors.black12
            )
          ),
        child: Column(
          children: [
            Image.network("${listData[index]["imageUrl"]}",height:180 ,),
            SizedBox(height: 10,),
            Text("${listData[index]["title"]}",
            style: TextStyle(
              fontSize: 18,
            ),
            ),
          ],
        ),
      );
  }
  @override
  Widget build(BuildContext context) {
    return GridView.builder(
        padding: EdgeInsets.all(10),
        itemCount:listData.length ,
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          mainAxisSpacing: 10,
          crossAxisSpacing: 10,
          childAspectRatio: 0.7,
        ),
        itemBuilder:_initGridViewData,
    );
  }
}
List listData = [
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl": "https://p.qqan.com/up/2021-7/16275387033501829.jpg",
  },
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl":
        "https://pic1.zhimg.com/v2-b59b1fe5c979f7cb7cdde7bf788a4f3a_r.jpg?source=1940ef5c",
  },
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl":
        "https://pic2.zhimg.com/v2-d6d0c956d30aa63894cc1cc96901ce07_r.jpg?source=1940ef5c",
  },
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl":
        "https://ts1.cn.mm.bing.net/th/id/R-C.0382d85bc77f87547a0d263d727ac78a?rik=DeEpYNkFDhNYwQ&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190815%2f2422bae53bbe495eadb8c35e4115f971.JPG&ehk=EXo1y564J33smY0E4iRbb%2b6Uf8x9szvNt480zkQXHyk%3d&risl=&pid=ImgRaw&r=0",
  },
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl":
        "https://tse1-mm.cn.bing.net/th/id/OIP-C.aBs3l0c_sS5UmTWOaK7wgAAAAA?pid=ImgDet&rs=1",
  },
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl":
        "https://pic2.zhimg.com/v2-8176dbd89ee8edecf5956bae2dd0642d_r.jpg?source=1940ef5c",
  },
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl":
        "https://ts1.cn.mm.bing.net/th/id/R-C.7538a1d27d1eb2bdaf4f7fe5171d3bb4?rik=Xo3lEaJdBdyZQQ&riu=http%3a%2f%2fdesk.fd.zol-img.com.cn%2fg5%2fM00%2f02%2f0F%2fChMkJlbK7JeIFhACAArOl2v-eCMAALKjgJtPOEACs6v923.jpg&ehk=o0LZfd%2fE2nk5E2n%2fxNapnr%2fCMkZLHYMbO25hE4LLq60%3d&risl=&pid=ImgRaw&r=0",
  },
  {
    "title": 'Candy Shop',
    "author": "Mohanmed Chin",
    "imageUrl":
        "https://ts1.cn.mm.bing.net/th/id/R-C.c316b5a061d2e6f534ea4669efaf4202?rik=CcnSN0WU9U1clA&riu=http%3a%2f%2fpic.bizhi360.com%2fbbpic%2f6%2f1106.jpg&ehk=HKvV9IRto0udrSWZrpOzTssWQ3oJBuwMAbT1T%2bKEWQw%3d&risl=&pid=ImgRaw&r=0",
  },
];

文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:表情:
评论列表 (暂无评论,0人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码