Flutter 中 GridView网格列表组件的使用

2020-12-22 15:40:07 浏览数 (2)

当数据量很大的时候用矩阵方式排列比较清晰,此时我们可以用网格列表组件 GridView 实现布局。

GridView 创建网格列表有多种方式,主要有以下两种:

1. GridView.count 实现网格布局;

2. GridView.builder 实现网格布局;

常用属性:

1. scrollDirection 滚动方向。值的类型为 Axis;

2. padding 内边距。值的类型为 EdgeInsets;

3. reverse 反向排序。值的类型为bool;

4. crossAxisSpacing 水平子组件的内边距。值的类型为double;

5. mainAxisSpacing 垂直子组件的内边距。值的类型为double;

6. crossAxisCount 一行的子组件的数量。值的类型为int;

7. childAspectRatio 子组件的宽高比例。值的类型为double;

8. children 子组件。值的类型为Widget;

9. gridDelegate 网格代理。主要用在 GridView.builder 里面控制布局,主要有以下两种值类型:

(1). SliverGridDelegateWithFixedCrossAxisCount(常用);

(2). SliverGridDelegateWithMaxCrossAxisExtent;

1. 用GridView.count 创建网格布局。

动态循环生成的数据创建网格列表。

代码语言:javascript复制
import 'package:flutter/material.dart';

void main(){
    runApp(MyApp());
}

// 抽离成一个单独的组件
class MyApp extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            home: Scaffold(
                // 导航条
                appBar:AppBar(title:Text('Flutter App')),
                // 主体
                body:HomeContent(),
            ),
            theme: ThemeData(primarySwatch:Colors.yellow),
        );
    }
}

// 动态循环生成的数据创建网格列表
class HomeContent extends StatelessWidget{
   List<Widget> _getData(){
        List<Widget> list = new List();
        for(int i =0;i<20;i  ){
            list.add(Container(
                alignment: Alignment.center,
                child:Text(
                    '这是第$i条数据',
                    style:TextStyle(
                        fontSize: 20.0,
                        color:Colors.red
                    )
                ),
                color:Colors.blue,
                // 在GridView中高度设置不管用
                height:500.0
            ));
        }
        return list;  
    }
    @override
    Widget build(BuildContext context) {
        // 网格构造器
        return  GridView.count(
            // 定义列数
            crossAxisCount: 2,
            // 定义列边距
            crossAxisSpacing: 20.0,
            // 定义行边距
            mainAxisSpacing: 20.0,
            // 定义内边距
            padding: EdgeInsets.all(10.0),
            // 宽度和高度的比例(变相的调整了高度)
            childAspectRatio: 0.8,
            // 子元素
            children: this._getData()
        );
    }
}

效果图如下:

用本地模拟的静态数据创建网格列表,以下是数据模拟:

代码语言:javascript复制
// lib/res/listData.dart

List listData = [
    {
        "title": 'Candy Shop',
        "author": 'Mohamed Chahin',
        "imageUrl": 'https://www.itying.com/images/flutter/1.png',
    },
    {
        "title": 'Childhood in a picture',
        "author": 'Google',
        "imageUrl": 'https://www.itying.com/images/flutter/2.png',
    },
    {
        "title": 'Alibaba Shop',
        "author": 'Alibaba',
        "imageUrl": 'https://www.itying.com/images/flutter/3.png',
    },
    {
        "title": 'Candy Shop',
        "author": 'Mohamed Chahin',
        "imageUrl": 'https://www.itying.com/images/flutter/4.png',
    },
    {
        "title": 'Tornado',
        "author": 'Mohamed Chahin',
        "imageUrl": 'https://www.itying.com/images/flutter/5.png',
    },
    {
        "title": 'Undo',
        "author": 'Mohamed Chahin',
        "imageUrl": 'https://www.itying.com/images/flutter/6.png',
    },
    {
        "title": 'white-dragon',
        "author": 'Mohamed Chahin',
        "imageUrl": 'https://www.itying.com/images/flutter/7.png',
    }
];

导入模拟的数据,生成列表。

代码语言:javascript复制
import 'package:flutter/material.dart';
import 'res/listData.dart';

void main(){
    runApp(MyApp());
}

// 抽离成一个单独的组件
class MyApp extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            home: Scaffold(
                // 导航条
                appBar:AppBar(title:Text('Flutter App')),
                // 主体
                body:HomeContent(),
            ),
            theme: ThemeData(primarySwatch:Colors.yellow),
        );
    }
}


// 用本地模拟的静态数据创建网格列表
class HomeContent extends StatelessWidget{

    List <Widget> _getListData(){
        var tempList = listData.map((obj){
            return Container(
                // 子元素
                child:Column(
                    // 子元素
                    children: <Widget>[
                        // 图片
                        Image.network(obj['imageUrl']),
                        // 图片与文字的间隔使用
                        SizedBox(height:12),
                        // 文字
                        Text(
                            obj['title'],
                            textAlign:TextAlign.center,
                            style:TextStyle(fontSize: 18)
                        ),
                    ],
                ),
                // 装饰
                decoration: BoxDecoration(
                    // 边框
                    border:Border.all(
                        // 颜色
                        color:Color.fromRGBO(233, 233, 233, 0.8),
                        // 边框宽度
                        width:1.0
                    )
                ),
            );
        });
        return tempList.toList();
    }
    @override
    Widget build(BuildContext context) {
        // 网格构造器
        return  GridView.count(
            // 定义列数
            crossAxisCount: 2,
            // 定义列边距
            crossAxisSpacing: 20.0,
            // 定义行边距
            mainAxisSpacing: 20.0,
            // 定义内边距
            padding: EdgeInsets.all(10.0),
            // 宽度和高度的比例(变相的调整了高度)
            // childAspectRatio: 0.8,
            // 子元素
            children: this._getListData()
        );
    }
}

效果图如下:

2. 用 GridView.builder 实现网格布局。

代码语言:javascript复制
import 'package:flutter/material.dart';
import 'res/listData.dart';

void main(){
    runApp(MyApp());
}

// 抽离成一个单独的组件
class MyApp extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            home: Scaffold(
                // 导航条
                appBar:AppBar(title:Text('Flutter App')),
                // 主体
                body:HomeContent(),
            ),
            theme: ThemeData(primarySwatch:Colors.yellow),
        );
    }
}



// 用flutter的builder生成网格
class HomeContent extends StatelessWidget{
    Widget _getListData(context,index){
        return Container(
            // 子元素
            child:Column(
                // 子元素
                children: <Widget>[
                    // 图片
                    Image.network(listData[index]['imageUrl']),
                    // 图片与文字的间隔使用
                    SizedBox(height:12),
                    // 文字
                    Text(
                        listData[index]['title'],
                        textAlign:TextAlign.center,
                        style:TextStyle(fontSize: 18)
                    ),
                ],
            ),
            // 装饰
            decoration: BoxDecoration(
                // 边框
                border:Border.all(
                    // 颜色
                    color:Color.fromRGBO(233, 233, 233, 0.8),
                    // 边框宽度
                    width:1.0
                )
            ),
        );
    }

    @override
    Widget build(BuildContext context) {
        // 网格构造器
        return  GridView.builder(
            // 定义网格相关样式
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                // 定义列
                crossAxisCount: 2,
                // 横向间隙
                mainAxisSpacing: 10.0,
                // 纵向间隙
                crossAxisSpacing: 10.0,
            ),
            // 数据数量
            itemCount: listData.length,
            // 所有数据
            itemBuilder:this._getListData
        );
    }
}

效果图如下:

0 人点赞