前面总结了使用ListView来实现列表,但是,有的时候,数据量很大,需要使用矩阵方式排列才能更清晰的展示数据,在flutter中,可以使用网格列表组件GridView来实现这个布局。

GridView接收如下可选参数属性:

  • scrollDirection:滚动方法
  • padding:内边距
  • resolve :组件反向排序
  • crossAxisSpacing :水平子 Widget 之间间距
  • mainAxisSpacing :垂直子 Widget 之间间距
  • crossAxisCount:一行的 Widget 数量
  • childAspectRatio:子 Widget 宽高比例
  • children:
  • gridDelegate:控制布局主要用在GridView.builder 里面

GridView.count 实现网格布局

  1. import 'package:flutter/material.dart';
  2.  
  3. void main() => runApp(MyApp());
  4.  
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. // TODO: implement build
  9. return MaterialApp(
  10. home: Scaffold(
  11. appBar: AppBar(title: Text('FlutterDemo')),
  12. body: LayoutDemo(),
  13. ));
  14. }
  15. }
  16. class LayoutDemo extends StatelessWidget {
  17. @override
  18. Widget build(BuildContext context) {
  19. return GridView.count(
  20.  
  21. crossAxisCount: 3, //一行的 Widget 数量
  22. children: <Widget>[
  23. Text('这是一个文本'),
  24. Text('这是一个文本'),
  25. Text('这是一个文本'),
  26. Text('这是一个文本'),
  27. Text('这是一个文本'),
  28. Text('这是一个文本'),
  29. Text('这是一个文本'),
  30. Text('这是一个文本'),
  31. Text('这是一个文本'),
  32. Text('这是一个文本'),
  33. Text('这是一个文本'),
  34. Text('这是一个文本'),
  35. Text('这是一个文本'),
  36. Text('这是一个文本')
  37. ],
  38. );
  39. }
  40. }

动态数据

  1. class LayoutDemo extends StatelessWidget {
  2. List<Widget> _getListData() {
  3. List listData=[
  4. {
  5. "title": 'Candy Shop',
  6. "author": 'Mohamed Chahin',
  7. "imageUrl": 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2191520521,2689315141&fm=27&gp=0.jpg',
  8. },
  9. {
  10. "title": 'Childhood in a picture',
  11. "author": 'Google',
  12. "imageUrl": 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2606512668,2361120991&fm=27&gp=0.jpg',
  13. },
  14. {
  15. "title": 'Alibaba Shop',
  16. "author": 'Alibaba',
  17. "imageUrl": 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2191520521,2689315141&fm=27&gp=0.jpg',
  18. },
  19. ];
  20. var tempList=listData.map((value){
  21. return Container(
  22. child:Column(
  23. children: <Widget>[
  24. Image.network(value['imageUrl']),
  25. SizedBox(height: 12),
  26. Text(
  27. value['title'],
  28. textAlign: TextAlign.center,
  29. style: TextStyle(
  30. fontSize: 20
  31. ),
  32. )
  33. ],
  34. ),
  35. decoration: BoxDecoration(
  36. border: Border.all(
  37. color:Color.fromRGBO(233, 233,233, 0.9),
  38. width: 1
  39. )
  40. ),
  41. // height: 400, //设置高度没有反应
  42. );
  43. });
  44. return tempList.toList();
  45. }
  46.  
  47. @override
  48. Widget build(BuildContext context) {
  49. return GridView.count(
  50. crossAxisSpacing:10.0 , //水平子 Widget 之间间距
  51. mainAxisSpacing: 10.0, //垂直子 Widget 之间间距
  52. padding: EdgeInsets.all(10),
  53. crossAxisCount: 2, //一行的 Widget 数量
  54. // childAspectRatio:0.7, //宽度和高度的比例
  55. children: this._getListData(),
  56. );
  57. }
  58. }

GridView.builder 实现网格布局

  1. class LayoutDemo extends StatelessWidget {
  2. List listData=[
  3. {
  4. "title": 'Candy Shop',
  5. "author": 'Mohamed Chahin',
  6. "imageUrl": 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2606512668,2361120991&fm=27&gp=0.jpg',
  7. },
  8. {
  9. "title": 'Childhood in a picture',
  10. "author": 'Google',
  11. "imageUrl": 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2191520521,2689315141&fm=27&gp=0.jpg',
  12. },
  13. ];
  14.  
  15. Widget _getListData (context,index) {
  16. return Container(
  17. child:Column(
  18. children: <Widget>[
  19. Image.network(listData[index]['imageUrl']),
  20. SizedBox(height: 12),
  21. Text(
  22. listData[index]['title'],
  23. textAlign: TextAlign.center,
  24. style: TextStyle(
  25. fontSize: 20
  26. ),
  27. )
  28. ],
  29. ),
  30. decoration: BoxDecoration(
  31. border: Border.all(
  32. color:Color.fromRGBO(233, 233,233, 0.9),
  33. width: 1
  34. )
  35. ),
  36. // height: 400, //设置高度没有反应
  37. );
  38. }
  39.  
  40. @override
  41. Widget build(BuildContext context) {
  42. return GridView.builder(
  43. //注意
  44. gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
  45. crossAxisSpacing:10.0 , //水平子 Widget 之间间距
  46. mainAxisSpacing: 10.0, //垂直子 Widget 之间间距
  47. crossAxisCount: 2, //一行的 Widget 数量
  48. ),
  49. itemCount: listData.length,
  50. itemBuilder:this._getListData,
  51. );
  52. }
  53. }

flutter网格布局之GridView组件的更多相关文章

  1. Flutter 页面布局 Stack层叠组件

    Stack 表示堆的意思,我们可以用 Stack 或者 Stack 结合 Align 或者 Stack 结合 Positiond 来实现页面的定位布局 属性 说明 alignment 配置所有子元素的 ...

  2. 9Flutter GridView组件 以及动态GridView

    main.dart import 'package:flutter/material.dart'; import 'res/listData.dart'; /* GridView : 通过GridVi ...

  3. 11Flutter页面布局 Stack层叠组件 Stack与Align Stack与Positioned实现定位布局

    /* Flutter 页面布局 Stack层叠组件: Stack与Align Stack与Positioned实现定位布局: Flutter Stack组件: Stack表示堆得意思,我们可以用Sta ...

  4. flutter GridView 网格布局

    当数据量很大的时候用矩阵方式排列比较清晰.此时我们可以用网格列表组件 GridView 实 现布局. GridView 创建网格列表有多种方式,常用有以下两种. 1.可以通过 GridView.cou ...

  5. Flutter——GridView组件(网格列表组件)

    GridView组件的常用参数: 名称 类型 说明 scrollDirection Axis 滚动方法 padding EdgeInsetsGeometry 内边距 resolve bool 组件反向 ...

  6. Flutter中打造多行列列表GridView组件的使用

    GridView组件.一个可滚动的二维空间数组. 在使用无限加载滚动列表的时候,最先使用的还是ListView组件.但若是要一行显示2列或者更多列的滚动列表,GridView组件更为方便.如下 在向服 ...

  7. 【Flutter】布局类组件之对齐和相对定位

    前言 如果只想简单的调整一个子元素在父元素中的位置的话,使用Align组件会更简单一些. 接口描述 const Align({ Key key, // 需要一个AlignmentGeometry类型的 ...

  8. Flutter中用ListView嵌套GridView报错异常

    flutter中的ListView组件和GridView组件都是常用的布局组件,有时候ListView中需要嵌套GridView来使用,例如下图: 这种情况就需要在ListView里面再嵌套一个Gri ...

  9. Flutter的布局方法

    重点是什么? Widgets 是用于构建UI的类. Widgets 用于布局和UI元素. 通过简单的widget来构建复杂的widget Flutter布局机制的核心就是widget.在Flutter ...

随机推荐

  1. MAC 安装jenkins

    下载地址 : https://jenkins.io/zh/download/ 由于用dmg安装包去安装jenkins,Jenkins不会用本地的用户去构建,任何创建的文件都是“jenkins”用户所有 ...

  2. Red Hat Linux下安装JDK

    1. 下载Linux平台的JDK 下载对应操作系统的jdk,操作系统是32位的就下32位的jdk,64位的就下64位的jdk.下错了装不上的. 下载地址:http://www.Oracle.com/t ...

  3. linux sed如何锁定某一行数据进行替换

  4. HTML中margin与padding的区别!(转)

    我们以DIV为一个盒子为例,既然和现实生活中的盒子一样,那我们想一下,生活中的盒子内部是不是空的好用来存放东西,而里面存放东西的区域我们给他起个名字叫“content(内容)”,而盒子的纸壁给他起个名 ...

  5. poj3614Sunscreen

    Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...

  6. STL之pair及其非成员函数make_pair()

    std::pair是一个结构模板,提供了一种将两个异构对象存储为一个单元的方法. 定义于头文件 <utility> template< class T1, class T2 > ...

  7. 记一次 Json 对象转换为 Java 对象的问题

    1.描述 最近在使用 Jackson 将 Json 串转换回 Java 对象的时候遇到了 ClassCastException 错误,特此记述. 2.问题复现 问题出现的节点在于属性节点的 JavaT ...

  8. [Linux] 027 RPM 包与 源码包的区别

    1. 区别 安装之前的区别: 概念上的区别 安装之后的区别: 安装位置不同 2. RPM 包安装位置 安装在默认位置中 RPM 包默认安装路径 明细 /ect 配置文件安装目录 /usr/bin/ 可 ...

  9. 断路器,AOP实现断路器模式 ------------Hystrix

    断路器:https://martinfowler.com/bliki/CircutiBreaker.html 核心思想: 在断路器对象中封装受保护的方法调用. 该断路器监控调用和断路情况 调用失败触发 ...

  10. P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)

    P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞   先跑一遍Floyd处理出$dis[i][j]$ 注意到走 ...