Flutter开发之GridView组件(20)

参考文章:https://www.jianshu.com/p/fb3bf633ee12

GridView有5种写法

写法一:GridView.count (body: myGridView1())
写法二:GridView.builder (body: myGridView2())
写法三:GridView.builder(SliverGridDelegateWithMaxCrossAxisExtent)(body: myGridView3())
写法四:GridView.custom (childrenDelegate: SliverChildBuilderDelegate)(body: myGridView4())
写法五:GridView.extent(允许您指定最大像素宽度) (body: myGridView5())

建一个页面
import 'package:flutter/material.dart';

// widget 封装
Widget initBodyCustom() {
  return Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Container(
          padding: EdgeInsets.only(top: 20),
          width: 200,
          height: 60,
          color:Colors.orange,
          child: Text("This is First Screen11",textAlign:TextAlign.center,),
        ),
      ],
    ),
  );
}

// 构建路由传参
class GridViewTest extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GardViewTest"),
        backgroundColor: Colors.orange,
      ),

      body: initBodyCustom(),
      // body: myGridView1(),
      // body: myGridView2(context),
      // body: myGridView3(context),
      // body: myGridView4(context),
      body: myGridView5(context),
    );
  }
}

1、 body: initBodyCustom(),

在这里插入图片描述

2、准备数据源
List<String> getDataList() {
  List<String> list = [];
  for (int i = 0; i < 100; i++) {
    list.add(i.toString());
  }
  return list;
}

// map 的用法 <Widget> 返回值类型
// .toList()返回迭代器返回的元素的数组
List<Widget>getWidgetList(){
  return getDataList().map<Widget>((String item)
      {
        return getItemContainer(item);
      }).toList();
}

// ItemView
Widget getItemContainer(String item) {
  return GestureDetector(
      onTap: () {
        //处理点击事件
        print("哈哈哈。。。哈哈哈哈。。。");
      },
  child: Container(
    color: Colors.blue,
    child: new Column(
      //mainAxisAlignment: MainAxisAlignment.center,
      children:<Widget>[

        Expanded(
          flex:3,//这个item占据剩余空间的份数,因为总数为3,所以此处占据2/3
          child: Container(
            //alignment: Alignment.center,
            alignment: Alignment(0.0,0.5),
            //padding: EdgeInsets.only(top: 35),
            child: Text(item,style: TextStyle(color: Colors.white,fontSize: 20),
            ),
          ),
        ),

        Expanded(
          flex:1,//这个item占据剩余空间的份数,因为总数为3,所以此处占据2/3
          child: Container(
            //alignment: Alignment(-1.0,0),
            //alignment:Alignment.center,
            padding: EdgeInsets.only(top: 5),
            width: 100,
            height: 40,
            child: Text("满200减50",
              textAlign: TextAlign.center, // 与上面Alignment冲突
              style: TextStyle(color: Colors.white,fontSize: 16),
            ),
          ),
        ),

      ],
    ),
  ),
    
  );
}

getItemContainer()相当于iOS 中的cell 或者 Item 一个公共组件

3、body: myGridView1(),
// GridView 1 封装
Widget myGridView1() {
  return GridView.count(
    //水平子Widget之间间距
    crossAxisSpacing: 10.0,
    //垂直子Widget之间间距
    mainAxisSpacing: 30.0,
    //GridView内边距
    padding: EdgeInsets.all(10.0),
    //一行的Widget数量
    crossAxisCount: 2,
    //子Widget宽高比例
    childAspectRatio: 2.0,
    //子Widget列表
    children: getWidgetList(),
  );
}

在这里插入图片描述

4、body: myGridView2(),

// GridView 2 封装
Widget myGridView2(BuildContext context) {
  List<String> datas = getDataList();
  return GridView.builder(

      itemCount: datas.length,
      itemBuilder: (BuildContext context, int index) {
        //Widget Function(BuildContext context, int index)
        return getItemContainer(datas[index]);
      },

      //SliverGridDelegateWithFixedCrossAxisCount 构建一个横轴固定数量Widget
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          //横轴元素个数
          crossAxisCount: 3,
          //纵轴间距
          mainAxisSpacing: 20.0,
          //横轴间距
          crossAxisSpacing: 10.0,
          //子组件宽高长度比例
          childAspectRatio: 1.0
      ),

  );
}

在这里插入图片描述

5、body: myGridView3(),
// GridView 3 封装
Widget myGridView3(BuildContext context) {
  List<String> datas = getDataList();
  return GridView.builder(

    itemCount: datas.length,
    itemBuilder: (BuildContext context, int index) {
      return getItemContainer(datas[index]);
    },

    // 对于SliverGridDelegateWithMaxCrossAxisExtent而言,
    // 水平方向元素个数不再固定,其水平个数也就是有几列,
    // 由maxCrossAxisExtent和屏幕的宽度以及padding和mainAxisSpacing等决定。
    gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
        //单个子Widget的水平最大宽度
        maxCrossAxisExtent: 100,
        //水平单个子Widget之间间距
        mainAxisSpacing: 20.0,
        //垂直单个子Widget之间间距
        crossAxisSpacing: 10.0
    ),
  );
}

在这里插入图片描述

6、body: myGridView4(),
// GridView 4 封装
Widget myGridView4(BuildContext context) {
  List<String> datas = getDataList();
  return GridView.custom(

      padding: EdgeInsets.all(10),
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 3,
        mainAxisSpacing: 10.0,
        crossAxisSpacing: 20.0,
      ),

      childrenDelegate: SliverChildBuilderDelegate((context, position) {
        return getItemContainer(datas[position]);
      },
          childCount: datas.length
      )
  );
}

在这里插入图片描述

6、body: myGridView5(),
// GridView 5 封装
Widget myGridView5(BuildContext context) {
  List<String> datas = getDataList();
  return GridView.extent(
      padding: EdgeInsets.all(10),
      // item 最大宽度200
      maxCrossAxisExtent: 200.0,
      mainAxisSpacing: 4.0,
      crossAxisSpacing: 4.0,
      children: getWidgetList(),
      semanticChildCount:datas.length,
  );
}

在这里插入图片描述

最后借一张gif

在这里插入图片描述

这里面我还增加了点击- item -的点击事件,只需要把 index 穿过去即可处理。

注意⚠️: 在显示二维列表时,重要的是单元格占用哪一行和哪一列时, 应该使用Table或 DataTable。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值