新建项目-7.png

继承关系和ListView是一样的

构造函数

  1. GridView({
  2. Key key,
  3. Axis scrollDirection = Axis.vertical,
  4. bool reverse = false, //控制 GridView 里列表项的排列顺序,是按照插入顺序排,
  5. 还是按照插入顺序相反的方向排序。
  6. 默认为 false,就是按照插入顺序排序,第一个插入的在头部
  7. ,当 reverse true 时,第一个插入的会在底部
  8. ScrollController controller, //可以控制 GridView 滚动的位置
  9. ScrollController 提供以下的几个功能:
  10. 1.设置 GridView 滑动的初始位置
  11. 2.可以控制 GridView 是否存储和恢复滑动的位置
  12. 3.可以读取、设置当前滑动的位置
  13. 可以继承 ScrollController 实现自定义的功能
  14. primary true 时,controller 必须为 null
  15. bool primary, //是否是与父级关联的主滚动视图
  16. 当为 true 时,即使 GridView 里没有足够的内容也能滑动
  17. ScrollPhysics physics,
  18. bool shrinkWrap = false,
  19. EdgeInsetsGeometry padding,
  20. @required this.gridDelegate, //控制 GridView 中 子Widget 布局的委托。
  21. SliverGridDelegate 的实现有两个:
  22. SliverGridDelegateWithMaxCrossAxisExtent:横轴 Widget 为固定长度的布局算法
  23. SliverGridDelegateWithFixedCrossAxisCount:横轴 Widget 为固定数量的布局算法
  24. bool addAutomaticKeepAlives = true,
  25. bool addRepaintBoundaries = true,
  26. bool addSemanticIndexes = true,
  27. double cacheExtent,
  28. List<Widget> children = const <Widget>[],
  29. int semanticChildCount,
  30. })

SliverGridDelegateWithFixedCrossAxisCount

该子类实现了一个横轴为固定数量子元素的layout算法,其构造函数为:

  1. SliverGridDelegateWithFixedCrossAxisCount({
  2. @required double crossAxisCount,
  3. double mainAxisSpacing = 0.0,
  4. double crossAxisSpacing = 0.0,
  5. double childAspectRatio = 1.0,
  6. })
  • crossAxisCount:横轴子元素的数量。此属性值确定后子元素在横轴的长度就确定了,即ViewPort横轴长度除以crossAxisCount的商。
  • mainAxisSpacing:主轴方向的间距。
  • crossAxisSpacing:横轴方向子元素的间距。
  • childAspectRatio:子元素在横轴长度和主轴长度的比例。由于crossAxisCount指定后,子元素横轴长度就确定了,然后通过此参数值就可以确定子元素在主轴的长度。

SliverGridDelegateWithMaxCrossAxisExtent

该子类实现了一个横轴子元素为固定最大长度的layout算法,其构造函数为:

  1. SliverGridDelegateWithMaxCrossAxisExtent({
  2. double maxCrossAxisExtent,
  3. double mainAxisSpacing = 0.0,
  4. double crossAxisSpacing = 0.0,
  5. double childAspectRatio = 1.0,
  6. })

maxCrossAxisExtent为子元素在横轴上的最大长度,之所以是“最大”长度,是因为横轴方向每个子元素的长度仍然是等分的,举个例子,如果ViewPort的横轴长度是450,那么当maxCrossAxisExtent的值在区间[450/4,450/3)内的话,子元素最终实际长度都为112.5,而childAspectRatio所指的子元素横轴和主轴的长度比为最终的长度比。其它参数和SliverGridDelegateWithFixedCrossAxisCount相同。

GridView

例子:

  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. class MinePage extends StatefulWidget {
  4. @override
  5. _MinePageState createState() => _MinePageState();
  6. }
  7. class _MinePageState extends State<MinePage> {
  8. @override
  9. Widget build(BuildContext context) {
  10. return Scaffold(
  11. appBar: AppBar(
  12. title: Text("我的"),
  13. ),
  14. body: Container(
  15. padding: EdgeInsets.all(10),
  16. child: GridView(
  17. gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  18. crossAxisCount: 3, //横轴列数
  19. crossAxisSpacing: 10, //横轴间距(Y轴)
  20. mainAxisSpacing: 10, //主轴间距(x轴)
  21. ),
  22. children: <Widget>[
  23. Container(color: Colors.red),
  24. Container(color: Colors.redAccent),
  25. Container(color: Colors.yellow),
  26. Container(color: Colors.orange),
  27. Container(color: Colors.brown),
  28. Container(color: Colors.purple),
  29. Container(color: Colors.yellowAccent),
  30. Container(color: Colors.orangeAccent),
  31. Container(color: Colors.green),
  32. Container(color: Colors.blueGrey),
  33. Container(color: Colors.lightBlueAccent),
  34. Container(color: Colors.deepPurpleAccent),
  35. Container(color: Colors.lightGreen),
  36. ],
  37. ),
  38. ),
  39. );
  40. }
  41. }

2020-04-13 14.44.48.gif

GridView.count

GridView.count构造函数内部使用了SliverGridDelegateWithFixedCrossAxisCount,我们通过它可以快速的创建横轴固定数量子元素的GridView

例子:

  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. class MinePage extends StatefulWidget {
  4. @override
  5. _MinePageState createState() => _MinePageState();
  6. }
  7. class _MinePageState extends State<MinePage> {
  8. @override
  9. Widget build(BuildContext context) {
  10. return Scaffold(
  11. appBar: AppBar(
  12. title: Text("我的"),
  13. ),
  14. body: Container(
  15. padding: EdgeInsets.all(10),
  16. child: GridView.count(
  17. crossAxisCount: 3, //y轴显示列数
  18. crossAxisSpacing: 10,
  19. mainAxisSpacing: 10,
  20. children: <Widget>[
  21. Container(color: Colors.red),
  22. Container(color: Colors.redAccent),
  23. Container(color: Colors.yellow),
  24. Container(color: Colors.orange),
  25. Container(color: Colors.brown),
  26. Container(color: Colors.purple),
  27. Container(color: Colors.yellowAccent),
  28. Container(color: Colors.orangeAccent),
  29. Container(color: Colors.green),
  30. Container(color: Colors.blueGrey),
  31. Container(color: Colors.lightBlueAccent),
  32. Container(color: Colors.deepPurpleAccent),
  33. Container(color: Colors.lightGreen),
  34. ],
  35. ),
  36. ),
  37. );
  38. }
  39. }

看效果是一样的,只是这里用的是 GridView.count

2020-04-13 15.15.47.gif

GridView.extent

GridView.extent构造函数内部使用了SliverGridDelegateWithMaxCrossAxisExtent,我们通过它可以快速的创建纵轴子元素为固定最大长度的的GridView

例子:

  1. body: Container(
  2. padding: EdgeInsets.all(10),
  3. child: GridView.extent(
  4. //最大宽度
  5. maxCrossAxisExtent: 100,
  6. crossAxisSpacing: 10,
  7. mainAxisSpacing: 10,
  8. children: <Widget>[
  9. Container(color: Colors.red),
  10. Container(color: Colors.redAccent),
  11. Container(color: Colors.yellow),
  12. Container(color: Colors.orange),
  13. Container(color: Colors.brown),
  14. Container(color: Colors.purple),
  15. Container(color: Colors.yellowAccent),
  16. Container(color: Colors.orangeAccent),
  17. Container(color: Colors.green),
  18. Container(color: Colors.blueGrey),
  19. Container(color: Colors.lightBlueAccent),
  20. Container(color: Colors.deepPurpleAccent),
  21. Container(color: Colors.lightGreen),
  22. Container(color: Colors.green),
  23. ],
  24. ),
  25. ),

2020-04-13 15.36.47.gif

GridView.builder

例子:

  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. class MinePage extends StatefulWidget {
  4. @override
  5. _MinePageState createState() => _MinePageState();
  6. }
  7. class _MinePageState extends State<MinePage> {
  8. @override
  9. Widget build(BuildContext context) {
  10. return Scaffold(
  11. appBar: AppBar(
  12. title: Text("我的"),
  13. ),
  14. body: Container(
  15. padding: EdgeInsets.all(10),
  16. child: GridView.builder(
  17. gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  18. crossAxisCount: 4,
  19. childAspectRatio: 1.0, //宽高比例 1.0 为相等
  20. crossAxisSpacing: 10,
  21. mainAxisSpacing: 10,
  22. ),
  23. itemBuilder: (context,index) {
  24. return Container(
  25. alignment: Alignment.center,
  26. color: Colors.orange,
  27. child: Text("$index"),
  28. );
  29. },
  30. itemCount: 50,
  31. ),
  32. ),
  33. );
  34. }
  35. }

2020-04-13 15.45.57.gif