GridView 和 ListView 是 Flutter 中用于构建滚动列表的两种常见小部件。它们之间的主要区别在于它们的布局方式和如何显示其子小部件。
布局方式:
- ListView 是单列或单行的滚动列表,它垂直或水平滚动。可以根据需要垂直排列或水平排列子小部件。
- GridView 是一个二维网格列表,可以在垂直和水平方向上滚动。子小部件以行和列的形式进行排列。
子小部件排列:
- ListView 的子小部件是单列(或单行)排列的,依次从顶部到底部(或从左到右)排列。它适合于在一个方向上展示大量垂直或水平排列的数据。
- GridView 的子小部件是以二维网格的形式排列的,可以按行或列展示。根据不同的构造函数,可以设置子小部件在交叉轴上的方式,例如可以设置为垂直或水平方向。
子小部件数量:
- ListView 的子小部件数量可以是有限的或无限的。它可以使用一个 List 或 Builder 来动态构建子小部件列表。
- GridView 的子小部件数量也可以是有限的或无限的。它可以使用 gridDelegate 属性来配置网格的排列方式,以及使用 children、childrenDelegate 或 Builder 来设置子小部件。
适用场景:
- ListView 适用于在一个方向上展示大量的数据,例如聊天记录、商品列表等。
- GridView 适用于将数据以网格的形式展示,例如照片墙、图标展示等。
下面展示一个简单网格布局
代码实现也很简单
Widget build(BuildContext context) { return GridView.count(crossAxisCount: 3, children: [ Icon(ItyingFont.icon1,color: Colors.green,), Icon(ItyingFont.icon2,color: Colors.amberAccent,), Icon(ItyingFont.icon3,color: Colors.blue,), Icon(Icons.add,color:Colors.pink,), Icon(Icons.access_time,color: Colors.purple,), Icon(Icons.add_alert_sharp,color: Colors.cyanAccent,), Icon(Icons.ac_unit,color: Colors.cyanAccent,), Icon(Icons.access_time_outlined,color: Colors.amber,), Icon(Icons.access_time_filled,color: Colors.deepPurpleAccent,), ], ); }
crossAxisCount 是列组件的数量,由自己定义,再用children来装载内容
上面这个代码是通过GridView.count 来实现,下面用GridView.extent来实现,与GridView.count不同的是 GridView.extent 通过 maxCrossAxisExtent (组件的最大长度)来控制一行有多少个组件
Widget build(BuildContext context) { return GridView.extent(maxCrossAxisExtent: 150.0, //每个组件的最大长度 children: [ Icon(ItyingFont.icon1,color: Colors.green,), Icon(ItyingFont.icon2,color: Colors.amberAccent,), Icon(ItyingFont.icon3,color: Colors.blue,), Icon(Icons.add,color:Colors.pink,), Icon(Icons.access_time,color: Colors.purple,), Icon(Icons.add_alert_sharp,color: Colors.cyanAccent,), Icon(Icons.ac_unit,color: Colors.cyanAccent,), Icon(Icons.access_time_outlined,color: Colors.amber,), Icon(Icons.access_time_filled,color: Colors.deepPurpleAccent,), ], ); }
那如果要实现下面的效果呢?
用 GridView.count 怎么实现呢,看代码
class Page extends StatelessWidget { Page({Key? key}) : super(key: key); List _initGridViewData() { List temlist = []; for (var i = 0; i那要是用 GridView.extend 呢@override Widget build(BuildContext context) { return GridView.extent( padding: EdgeInsets.all(10), //每个组件的最大长度 maxCrossAxisExtent: 120, //水平子 Widget 之间的间距 crossAxisSpacing: 10.0, //垂直子 Widget 之间的间距 mainAxisSpacing: 10.0, // 宽高比 childAspectRatio: 0.7, children: _initGridViewData()); }如何实现下面的效果呢看看代码如下
import 'package:flutter/material.dart'; // import 'package:hive/hive.dart'; import 'package:pivot_chat/widgets/button/_PCHomePageButton.dart'; class test extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( leading: IconButton( onPressed: () {}, icon: Icon( ItyingFont.icon1, color: Colors.pinkAccent, ), ), ), body: Page(), ), ); } } class Page extends StatelessWidget { Page({Key? key}) : super(key: key); Widget _initGridViewData(context ,int index) { return Container( height: 200, // 设置一个 外边框 decoration: BoxDecoration( border: Border.all( color: Colors.black12 ) ), child: Column( children: [ Image.network("${listData[index]["imageUrl"]}",height:180 ,), SizedBox(height: 10,), Text("${listData[index]["title"]}", style: TextStyle( fontSize: 18, ), ), ], ), ); } @override Widget build(BuildContext context) { return GridView.builder( padding: EdgeInsets.all(10), itemCount:listData.length , gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 0.7, ), itemBuilder:_initGridViewData, ); } } List listData = [ { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://p.qqan.com/up/2021-7/16275387033501829.jpg", }, { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://pic1.zhimg.com/v2-b59b1fe5c979f7cb7cdde7bf788a4f3a_r.jpg?source=1940ef5c", }, { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://pic2.zhimg.com/v2-d6d0c956d30aa63894cc1cc96901ce07_r.jpg?source=1940ef5c", }, { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://ts1.cn.mm.bing.net/th/id/R-C.0382d85bc77f87547a0d263d727ac78a?rik=DeEpYNkFDhNYwQ&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190815%2f2422bae53bbe495eadb8c35e4115f971.JPG&ehk=EXo1y564J33smY0E4iRbb%2b6Uf8x9szvNt480zkQXHyk%3d&risl=&pid=ImgRaw&r=0", }, { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://tse1-mm.cn.bing.net/th/id/OIP-C.aBs3l0c_sS5UmTWOaK7wgAAAAA?pid=ImgDet&rs=1", }, { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://pic2.zhimg.com/v2-8176dbd89ee8edecf5956bae2dd0642d_r.jpg?source=1940ef5c", }, { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://ts1.cn.mm.bing.net/th/id/R-C.7538a1d27d1eb2bdaf4f7fe5171d3bb4?rik=Xo3lEaJdBdyZQQ&riu=http%3a%2f%2fdesk.fd.zol-img.com.cn%2fg5%2fM00%2f02%2f0F%2fChMkJlbK7JeIFhACAArOl2v-eCMAALKjgJtPOEACs6v923.jpg&ehk=o0LZfd%2fE2nk5E2n%2fxNapnr%2fCMkZLHYMbO25hE4LLq60%3d&risl=&pid=ImgRaw&r=0", }, { "title": 'Candy Shop', "author": "Mohanmed Chin", "imageUrl": "https://ts1.cn.mm.bing.net/th/id/R-C.c316b5a061d2e6f534ea4669efaf4202?rik=CcnSN0WU9U1clA&riu=http%3a%2f%2fpic.bizhi360.com%2fbbpic%2f6%2f1106.jpg&ehk=HKvV9IRto0udrSWZrpOzTssWQ3oJBuwMAbT1T%2bKEWQw%3d&risl=&pid=ImgRaw&r=0", }, ];
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...