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,
    );
  }
}

原文地址:https://www.cnblogs.com/yuyujuan/p/10969390.html

时间: 2024-07-31 02:58:10

flutter网格布局之GridView组件的相关文章

GridView和SimpleAdapter实现网格布局

android:horizontalSpacing 元素之间的水平间距 android:verticalSpacing     元素之间的垂直间距 android:numColumns         设置列数 android:stretchMode          拉伸模式 该程序的目的是将图片用适配器放入4列的gridView中,点击一个图片下方出现预览图. package com.kale.gridview02; import java.util.ArrayList; import ja

Android组件式开发(2)——实现网格布局的RadioButton矩阵

** 前言 ** 在Android中,我们一般通过RadioGroup来管理一组RadioButton 来达到 单选按钮的互斥效果.但是,有些需求中,需要完成N行N列这样的RadioButton组成的矩阵,但是我们的RadioGroup是一个耿直的LinearLayout,无法完成网格布局╮(╯▽╰)╭.所以,下面我就像大家来介绍一种实现网格布局的RadioButton的思路. 无图无真相, 先上一下效果图~ ** 思路 ** 提到网格布局,最简单的就是使用系统的GridView来实现,我们需要

7-4 基于GridView实现网格布局

网格布局 GridView.count允许我们控制,这一行显示几列.目前我们这里一行显示了两列. GridView.count来创建GridView 代码运行起来的效果 比如修改为一行显示3列 结束 原文地址:https://www.cnblogs.com/wangjunwei/p/12199317.html

android GridView网格布局,高度问题

项目中,遇到这样问题, 网格布局宽度自适应,但是高度设不了,文字和图片下面有一大片空白,将高度写死为306dp也不可以, 多方查找,得到答案,需要在适配器中 设置layoutparams设置高度, 代码如下 public class ServiceGridBaseAdapter extends BaseAdapter{ private Context mContext; private List<StaffEntity> mList; private StaffEntity entity; p

flutter页面布局一

Padding组件 在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属性.这个时候我们可以用 Padding 组件处理容器与子元素直接的间距. 该组件接收两个属性: padding :padding 值, EdgeInsetss 设置填充的值 child :子组件 例如,要实现前面的网格布局里面的单元格之间的间距,就可以使用Padding组件. import 'package:flutter/material.dart

Android UI之GridLayout(网格布局)

说明:网格布局是4.0之后添加的布局,跟TableLayout有点像,但更加好用,它把容器分为一个rows*columns的网格,每个网格都是一个组件位,可是通过设置让组件位占据多行/列. 与之相似地,还有一个叫做GridView的组件,无论功能和名称都很相似,不过GridView使用Adapter来填充组件位,GridLayout则要简化得多. 按照CSDN博主studyboyjlu4(博客地址:http://blog.csdn.net/studyboyjlu4)的看法,GridView和Gr

Flutter的布局方法

重点是什么? Widgets 是用于构建UI的类. Widgets 用于布局和UI元素. 通过简单的widget来构建复杂的widget Flutter布局机制的核心就是widget.在Flutter中,几乎所有东西都是一个widget - 甚至布局模型都是widget.您在Flutter应用中看到的图像.图标和文本都是widget. 甚至你看不到的东西也是widget,例如行(row).列(column)以及用来排列.约束和对齐这些可见widget的网格(grid). 您可以通过构建widge

JAVA 网格布局管理器

//网格布局管理器 import java.awt.*; import javax.swing.*; public class Jiemian3 extends JFrame{ //定义组件 JButton[] an = {null,null,null,null,null,null,null,null}; public static void main(String[] args){ //运行本类的构造方法 Jiemian3 jiemian = new Jiemian3(); } public

Java图形化界面设计——布局管理器之GridLayout(网格布局) 之计算器

代码如下: import java.awt.*; import javax.swing.*; public class GridFrame extends JFrame { // 定义字符串数组,为按钮的显示文本赋值 String str[] = { "MC", "MR", "MS", "M+", "←", "C", "%", "π", "