flutter网格布局之GridView组件

Posted yuyujuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter网格布局之GridView组件相关的知识,希望对你有一定的参考价值。

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

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

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

GridView.count 实现网格布局

import ‘package:flutter/material.dart‘;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    // TODO: implement build
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(‘FlutterDemo‘)),
        body: LayoutDemo(),
      ));
  

class LayoutDemo extends StatelessWidget   
  @override
  Widget build(BuildContext context)     
    return GridView.count(

        crossAxisCount: 3,  //一行的 Widget 数量
        children: <Widget>[
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘),
          Text(‘这是一个文本‘)
        ],
    );
  

技术图片

动态数据

class LayoutDemo extends StatelessWidget   
  List<Widget> _getListData() 
    List listData=[
      
          "title": ‘Candy Shop‘,
          "author": ‘Mohamed Chahin‘,
          "imageUrl": ‘https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2191520521,2689315141&fm=27&gp=0.jpg‘,
      ,
       
          "title": ‘Childhood in a picture‘,
          "author": ‘Google‘,
          "imageUrl": ‘https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2606512668,2361120991&fm=27&gp=0.jpg‘,
      ,
      
          "title": ‘Alibaba Shop‘,
          "author": ‘Alibaba‘,
          "imageUrl": ‘https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2191520521,2689315141&fm=27&gp=0.jpg‘,
      ,  
    ];
      var tempList=listData.map((value)
          return Container(            
            child:Column(
                children: <Widget>[
                  Image.network(value[‘imageUrl‘]),
                  SizedBox(height: 12),
                  Text(
                    value[‘title‘],
                    textAlign: TextAlign.center,
                    style: TextStyle(
                      fontSize: 20
                    ),
                  )
                ],
            ),
            decoration: BoxDecoration(
              border: Border.all(
                color:Color.fromRGBO(233, 233,233, 0.9),
                width: 1
              )
            ),
            // height: 400,  //设置高度没有反应
          );
      );
      return tempList.toList();
  

  @override
  Widget build(BuildContext context)     
    return GridView.count(
        crossAxisSpacing:10.0 ,   //水平子 Widget 之间间距
        mainAxisSpacing: 10.0,    //垂直子 Widget 之间间距
        padding: EdgeInsets.all(10),
        crossAxisCount: 2,  //一行的 Widget 数量
        // childAspectRatio:0.7,  //宽度和高度的比例
        children: this._getListData(),
    );
  

技术图片

GridView.builder 实现网格布局

 

class LayoutDemo extends StatelessWidget   
  List listData=[
      
          "title": ‘Candy Shop‘,
          "author": ‘Mohamed Chahin‘,
          "imageUrl": ‘https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2606512668,2361120991&fm=27&gp=0.jpg‘,
      ,
       
          "title": ‘Childhood in a picture‘,
          "author": ‘Google‘,
          "imageUrl": ‘https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2191520521,2689315141&fm=27&gp=0.jpg‘,
      ,
  ];

  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: 20
                    ),
                  )
                ],
            ),
            decoration: BoxDecoration(
              border: Border.all(
                color:Color.fromRGBO(233, 233,233, 0.9),
                width: 1
              )
            ),
             // height: 400,  //设置高度没有反应
          );
  

  @override
  Widget build(BuildContext context)     
    return GridView.builder(
        //注意
        gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisSpacing:10.0 ,   //水平子 Widget 之间间距
          mainAxisSpacing: 10.0,    //垂直子 Widget 之间间距          
          crossAxisCount: 2,  //一行的 Widget 数量
        ),
        itemCount: listData.length,
        itemBuilder:this._getListData,
    );
  

技术图片

 

以上是关于flutter网格布局之GridView组件的主要内容,如果未能解决你的问题,请参考以下文章

flutter 系列之:flutter 中常用的 GridView layout 详解

Flutter - 布局网格

Flutter学习基本组件之基本列表Gradview组件

Flutter 通过 GridView 实现网格布局

flutter学习GridView

flutter学习GridView