Flutter-GridView的使用说明

The most commonly used grid layouts are GridView.count, which creates a layout with a fixed number of tiles in the cross axis, and GridView.extent, which creates a layout with tiles that have a maximum cross-axis extent. A custom SliverGridDelegate can produce an arbitrary 2D arrangement of children, including arrangements that are unaligned or overlapping.

To create a grid with a large (or infinite) number of children, use the GridView.builder constructor with either a SliverGridDelegateWithFixedCrossAxisCount or a SliverGridDelegateWithMaxCrossAxisExtent for the gridDelegate.

To use a custom SliverChildDelegate, use GridView.custom.

To create a linear array of children, use a ListView.

To control the initial scroll offset of the scroll view, provide a controller with its ScrollController.initialScrollOffset property set

根据官方解释,当需要创建大量网格Widget的时候使用GridView。

1、GridView的常用定义

Axis scrollDirection = Axis.vertical,//设置滚动方向,vertical垂直滚动,horizontal水平滚动
bool reverse = false,//设置子Widget是否倒序展示
EdgeInsetsGeometry padding,//设置内边距
@required this.gridDelegate,//控制布局代理,只要使用SliverGridDelegateWithFixedCrossAxisCount和SliverGridDelegateWithMaxCrossAxisExtent
List<Widget> children = const <Widget>[],//一组子widget

2、使用GridView()的方式创建Widget

在使用过程中直接使用GridView来进行创建,这里面必须要实现一个代理方法,就是gridDelegate,这里我们使用SliverGridDelegateWithFixedCrossAxisCount来演示。

2.1首先来看一下SliverGridDelegateWithFixedCrossAxisCount的定义内容:
/// Creates a delegate that makes grid layouts with a fixed number of tiles in
/// the cross axis.
///
/// All of the arguments must not be null. The `mainAxisSpacing` and
/// `crossAxisSpacing` arguments must not be negative. The `crossAxisCount`
/// and `childAspectRatio` arguments must be greater than zero.
const SliverGridDelegateWithFixedCrossAxisCount({
@required this.crossAxisCount,//控制一行现实多少个子Widget
this.mainAxisSpacing = 0.0,//设置上下之间的间距(Axis.horizontal设置左右之间的间距)
this.crossAxisSpacing = 0.0,//设置左右之间的间距(Axis.horizontal设置上下之间的间距)
this.childAspectRatio = 1.0,//设置宽高比
})

SliverGridDelegateWithFixedCrossAxisCount里面定义的所有内容都不能为空;特别是mainAxisSpacing和crossAxisSpacing不能为负数,crossAxisCount和childAspectRatio一定要大于等于0。

演示代码如下:

Widget _gridViewDemo() {return GridView(padding: EdgeInsets.only(left: 16.0,right: 16.0,top: 16.0),scrollDirection: Axis.vertical,gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2,mainAxisSpacing: 10.0,crossAxisSpacing: 20.0,childAspectRatio: 0.7),children: <Widget>[Container(color: Colors.orange,),Container(color: Colors.red,),Container(color: Colors.grey,),Container(color: Colors.green,),Container(color: Colors.blue,),],);}

运行效果展示:

3、使用 GridView.builder的方式创建

GridView.builder创建的Widget必须实现gridDelegate的代理方法,这里使用SliverGridDelegateWithMaxCrossAxisExtent的代理;创建的属于无限个Widget

/// Creates a delegate that makes grid layouts with tiles that have a maximum
/// cross-axis extent.
///
/// All of the arguments must not be null. The [maxCrossAxisExtent] and
/// [mainAxisSpacing], and [crossAxisSpacing] arguments must not be negative.
/// The [childAspectRatio] argument must be greater than zero.
const SliverGridDelegateWithMaxCrossAxisExtent({
@required this.maxCrossAxisExtent,//
this.mainAxisSpacing = 0.0,
this.crossAxisSpacing = 0.0,
this.childAspectRatio = 1.0,

})

以上参数都不能为空。
this.maxCrossAxisExtent//当Axis.vertical时,表示在水平方向上一个Widget的宽度,一行能存放widget的个数为屏幕宽度除以设置的maxCrossAxisExtent值(width/maxCrossAxisExtent),当Axis. horizontal时,表示在垂直方向上一个Widget的高度,一列能够存放Widget的个数为屏幕高度除以设置的maxCrossAxisExtent值(height/maxCrossAxisExtent)。

演示代码:

Widget _gridViewBuilder() {Widget __itemBuilder(context,index) {return Stack(children: <Widget>[Image.network('http://pic2.16pic.com/00/01/72/16pic_172477_b.jpg',fit: BoxFit.cover,),Positioned(//            left: 20.0,top: 20.0,child: Text('GridView演示$index'))],);}return GridView.builder(//      scrollDirection: Axis.horizontal,gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(maxCrossAxisExtent: 200.0,mainAxisSpacing:20.0,crossAxisSpacing: 20.0,childAspectRatio: 0.8),itemBuilder: __itemBuilder);
}

运行结果如下:

当使用SliverGridDelegateWithFixedCrossAxisCount代理方法实现基本相似,只需要修改下代理方法里面的实现参数就可以。

4、使用GridView.count创建

GridView.count来创建Widget的时候,有点类似于直接使用GridView()的方式,只不过是把gridDelegate的实现方式放到了外面,具体的实现方式,请查看演示代码:

Widget _gridViewCount() {return GridView.count(crossAxisCount: 3,//每行展示个数mainAxisSpacing:20.0,//设置上下之间的间距(Axis.horizontal设置左右之间的间距)crossAxisSpacing: 20.0,//设置左右之间的间距(Axis.horizontal设置上下之间的间距)childAspectRatio: 0.8,//设置宽高比children: <Widget>[//一组子WidgetContainer(color: Colors.orange,),Container(color: Colors.red,),Container(color: Colors.grey,),Container(color: Colors.green,),Container(color: Colors.blue,),],);
}

运行情况请自行copy代码进行查看

5、使用GridView.custom进行创建

GridView.custom进行创建GridView的时候需要实现两个代理方法,gridDelegate和childrenDelegate;gridDelegate是进行布局的代理方法,控制每行或者每列的子Widget个数,以及上下左右间距和宽高比;childrenDelegate有两种实现方式:SliverChildListDelegate和SliverChildBuilderDelegate,这两种在实现上有一定的区别,使用的时候请注意。

下面给出演示代码:

  Widget _gridViewCustom() {
//创建方式一
List<Widget> __gridViewChildCustom() {List<Widget> children = new List();for(int index = 0; index < 20; index ++) {children.add(Container(color: Colors.orange,margin: EdgeInsets.only(bottom: 16.0,left: 16.0,right: 16.0),child: Text('GridView..$index', style: TextStyle(color: Colors.black,backgroundColor: Colors.grey),),));}return children;
}
return GridView.custom(gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3,mainAxisSpacing:20.0,crossAxisSpacing: 20.0,childAspectRatio: 0.8,),childrenDelegate: SliverChildListDelegate(__gridViewChildCustom())
);
//创建方式二
//    return GridView.custom(
//        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
//            crossAxisCount: 3,
//          mainAxisSpacing:20.0,
//          crossAxisSpacing: 20.0,
//          childAspectRatio: 0.8,
//        ),
//        childrenDelegate: SliverChildBuilderDelegate(
//                (BuildContext context, int index) {
//                  return Container(
//                    color: Colors.orange,
//                    child: Text('GridView$index', style: TextStyle(
//                      color: Colors.white,
//                      fontSize: 20.0
//                    ),),
//                  );
//                },
//          childCount: 6
//        ),
//    );}

运行效果如下:

Flutter-GridView的使用说明相关推荐

  1. Flutter GridView 组件 以及动态 GridView

    文章目录 一. Flutter 列表组件概述 二. Flutter GridView 组件的常用参数 三. Flutter GridView.count 实现网格布局 四. Flutter GridV ...

  2. flutter GridView 九宫格

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. [x1]微信公众号的每日提醒 随时随记 每日积累 随心而过 [x2]各种系列的视频教程 免费开源 关注 你不会迷路 [x3]系列文章 ...

  3. flutter -------- GridView的使用

    使用GridView将widget放置为二维列表. GridView提供了两个预制list,或者您可以构建自定义网格.当GridView检测到其内容太长而不适合渲染框时,它会自动滚动. GridVie ...

  4. Flutter——(GridView)使用教程

    GridView简介: 可以创建网格列表视图:主要通过Count.extent.custom.builder构造列表.有内边距.是否反向.滑动控制器等属性. 四个属性使用场景,Count.extent ...

  5. Flutter GridView禁止滑动

    Flutter 中的GridView禁止用户上下滑动可以使用physics属性 physics: const NeverScrollableScrollPhysics() 更多资源请访问: 超详细图文 ...

  6. flutter gridview 固定高度_Flutter +携程=?

    目录 主要页面,包括首页.搜索.旅拍和我的四个主页面 依赖库 实际效果 主要页面 整体框架采用PageView + BottomNavigationBar ,每个页面的状态保存采用AutomaticK ...

  7. Flutter GridView详解

    GridView GridView常用构造 GridView 构造函数 GridView.count 构造函数 分析和使用 GridView.extent 构造函数 分析和使用 GridView.bu ...

  8. Flutter - GridView

    GridView 表格类布局 GridView 在构建是,有两种方式 1 SliverGridDelegateWithFixedCrossAxisCount mainAxisSpacing:主轴方向的 ...

  9. flutter GridView和Wrap

    GridView有2种gridDelegate: [记录小嵌套冲突的问题,SingleChildScrollView,ListView,GrilView嵌套问题解决,子布局添加属性] physics: ...

  10. flutter - GridView 网格布局,以及设置子元素的间距和大小

    基础的 GridView 布局 参数 说明 gridDelegate 对子元素进行修饰,由于SliverGridDelegate 是一个抽象类, 找它的实现类有 [SliverGridDelegate ...

最新文章

  1. 【Python-ML】感知器学习算法(perceptron)
  2. 鸿蒙开发者社区入口,鸿蒙OS 社区
  3. OAM创始团队:揭秘OAMKubernetes实现核心原理
  4. 汽车销售网页html模板,汽车经销商HTML模板
  5. python入门教授_南开大学教授强力推荐的5本Python入门书籍,附电子版
  6. android自带模拟器吗,安卓sdk自带模拟器的使用
  7. 01 hadoop介绍、架构原理
  8. 基于C语言的个人信息管理系统
  9. NetSetMan特别版 网络地址切换工具
  10. 台式计算机装机软件选择,装机软件哪个好?小编教你最好的装机软件推荐
  11. 一个优秀程序员可抵五个普通程序员!
  12. Android 开发之初识 Android
  13. Centos6.3 安装rhythmbox播放器
  14. Unity C# compiler: CS0121: The call is ambiguous between the following methods or properties
  15. Failed to decode response: zlib_decode(): data error Retrying with degraded mode, check
  16. 【办公常用软件】万彩办公大师教程丨PDF OCR 帮助文档
  17. 国产手机销量同比大跌超过五成,手机库存货需10个月消化
  18. RK3399 Android7.1修改系统默认壁纸
  19. 用MySQL模拟消息队列
  20. (实用篇)php常用字符串函数实例总结【转换,替换,计算,截取,加密】

热门文章

  1. 大疆数字IC2019
  2. 金海通上交所上市:年营收4亿募资8.8亿 市值51亿
  3. 获取当前时间点为早上、中午、下午、傍晚等
  4. POJ 3271 BFS (大坑)
  5. 微信公众平台oauth2.0 php,微信公众平台oauth2.0网页授权
  6. 物体自动绕XYZ旋转
  7. 【第二章】(3)新手必须掌握的Linux命令之《系统状态检查命令》
  8. rasa安装spaCy
  9. 华为服务器本地备份系统,服务器系统备份方案
  10. 几百张图片快速批处理工具bat-sharp.js介绍