Flutter组件基础——GridView

GridView是网格布局,类似于iOS中的UICollectionView,可设置每行多少个、单个对象的宽高比、对象水平方向的间距、垂直方向的间距等等。

GridView的常用属性

  • GridView
    • scrollDirection: 滑动方向
      • Axis.horizontal: 水平方向滑动
      • Axis.vertical: 垂直方向滑动,默认为这个。
    • padding: GridView相对于父视图的边距
    • crossAxisCount: 每行多少个
    • mainAxisSpacing: 与滑动方向垂直的方向的间距,eg: 当横向滑动时,这个代表垂直方向对象之间的间距;
    • crossAxisSpacing: 与滑动方向平行的方向的间距,eg: 当横向滑动时,这个代表水平方向对象之间的间距;
    • childAspectRatio:单个元素的宽高比(或者高宽比),当scrollDirection为vertical时,代表宽高比;当scrollDirection为horizontal时,代表高宽比。

简单使用

代码如下:

  1. class MyApp extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. return MaterialApp(
  5. title: 'GridView widget',
  6. home: Scaffold(
  7. body: GridView.count(
  8. scrollDirection: Axis.vertical,
  9. childAspectRatio: 2,
  10. padding: const EdgeInsets.all(40.0),
  11. crossAxisSpacing: 10.0,
  12. mainAxisSpacing: 20.0,
  13. crossAxisCount: 2,
  14. children: <Widget>[
  15. Container(
  16. padding: const EdgeInsets.all(8),
  17. child: const Text("He'd have you all unravel at the"),
  18. color: Colors.teal[100],
  19. ),
  20. Container(
  21. padding: const EdgeInsets.all(8),
  22. child: const Text('Heed not the rabble'),
  23. color: Colors.teal[200],
  24. ),
  25. Container(
  26. padding: const EdgeInsets.all(8),
  27. child: const Text('Sourd of screams but the'),
  28. color: Colors.teal[300],
  29. ),
  30. Container(
  31. padding: const EdgeInsets.all(8),
  32. child: const Text('Who scream'),
  33. color: Colors.teal[400],
  34. ),
  35. Container(
  36. padding: const EdgeInsets.all(8),
  37. child: const Text('Revolution is coming...'),
  38. color: Colors.teal[500],
  39. ),
  40. Container(
  41. padding: const EdgeInsets.all(8),
  42. child: const Text('Revolution, they...'),
  43. color: Colors.teal[600],
  44. ),
  45. ],
  46. ),
  47. ));
  48. }
  49. }

效果如下:

Flutter组件基础——GridView - 图1

动态列表

代码如下:

  1. class MyGridView extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. return GridView.builder(
  5. padding: EdgeInsets.all(40.0),
  6. scrollDirection: Axis.horizontal,
  7. gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
  8. crossAxisCount: 2,
  9. mainAxisSpacing: 20.0,
  10. crossAxisSpacing: 10.0,
  11. childAspectRatio: 2.0),
  12. itemCount: 6,
  13. itemBuilder: (BuildContext context, int index) {
  14. return Card(
  15. color: Colors.amber,
  16. child: Center(
  17. child: Text('$index'),
  18. ),
  19. );
  20. });
  21. }
  22. }
  23. class MyApp extends StatelessWidget {
  24. @override
  25. Widget build(BuildContext context) {
  26. return MaterialApp(
  27. home: Scaffold(
  28. appBar: new AppBar(
  29. title: new Text('GridView builder'),
  30. ),
  31. body: MyGridView(),
  32. ),
  33. );
  34. }
  35. }

效果如下:

Flutter组件基础——GridView - 图2

参考

GridView Dev Doc
Flutter免费视频第二季-常用组件