首页 > 其他分享 >一统天下 flutter - widget 列表类: GridView - 网格

一统天下 flutter - widget 列表类: GridView - 网格

时间:2023-04-14 09:00:26浏览次数:57  
标签:widget GridView Container color 元素 网格 Colors 滚动 flutter

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - widget 列表类: GridView - 网格

示例如下:

lib\widget\list\grid_view.dart

/*
 * GridView - 网格
 */

import 'dart:math';

import 'package:flutter/material.dart';

import '../../helper.dart';

class GridViewDemo extends StatefulWidget {
  const GridViewDemo({Key? key}) : super(key: key);

  @override
  _GridViewDemoState createState() => _GridViewDemoState();
}

class _GridViewDemoState extends State<GridViewDemo> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("title")),
      backgroundColor: Colors.orange,
      body: Column(
        children: [
          /// GridView.count()
          Expanded(child: _Demo1(),),
          /// GridView.builder() 结合 SliverGridDelegateWithFixedCrossAxisCount()
          Expanded(child: _Demo2(),),
          /// GridView.builder() 结合 SliverGridDelegateWithMaxCrossAxisExtent()
          Expanded(child: _Demo3(),),
        ],
      ),
    );
  }
}

class _Demo1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    /// GridView.count() - 用于创建一个有固定数量元素的网格
    return GridView.count(
      /// 滚动方向 vertical 或 horizontal
      scrollDirection: Axis.vertical,
      /// 非滚动方向上的元素数量
      crossAxisCount: 3,
      /// 滚动方向上的元素之间的间距
      mainAxisSpacing: 10,
      /// 非滚动方向上的元素之间的间距
      crossAxisSpacing: 10,
      /// 网格控件本身的内间距
      padding: const EdgeInsets.all(10),
      /// 举例说明,如果网格是垂直滚动的话
      /// 那么横向排列的元素的数量是确定的,也就是说元素的宽度是确定的,然后通过这个参数指定宽和高的比值,从而确定元素的高度
      childAspectRatio: 2,
      /// 用于控制滚动的 ScrollController
      controller: null,

      /// 下面这 3 个参数的用法和 ListView 是一样的,参见 list_view.dart
      physics: const AlwaysScrollableScrollPhysics(),
      addAutomaticKeepAlives: true,
      addRepaintBoundaries: true,

      /// 组件集合
      children: [
        Container(color: Colors.red[100],),
        Container(color: Colors.red[200],),
        Container(color: Colors.red[300],),
        Container(color: Colors.red[400],),
        Container(color: Colors.red[500],),
        Container(color: Colors.green[100],),
        Container(color: Colors.green[200],),
        Container(color: Colors.green[300],),
        Container(color: Colors.green[400],),
        Container(color: Colors.green[500],),
        Container(color: Colors.blue[100],),
        Container(color: Colors.blue[200],),
        Container(color: Colors.blue[300],),
        Container(color: Colors.blue[400],),
        Container(color: Colors.blue[500],),
      ],
    );
  }
}

class _Demo2 extends StatelessWidget {

  final Random _random = Random();
  late final List<_MyModel> _myList;

  _Demo2({Key? key}) : super(key: key) {
    _myList = [for (var i = 0; i < 50; i++) _MyModel(name: "webabcd: $i", age: _random.nextInt(100))];
  }

  Widget _getItem(BuildContext context, int index) {
    return Container(
      color: Colors.red,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          MyTextSmall(_myList[index].name),
          MyTextSmall(_myList[index].age.toString()),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    /// GridView.builder() - 根据数据源动态生成对应的网格元素
    return GridView.builder(
      /// SliverGridDelegateWithFixedCrossAxisCount() - 用于指定非滚动方向上的元素的数量
      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
        /// 非滚动方向上的元素的数量
        crossAxisCount: 3,
        /// 滚动方向上的元素之间的间距
        mainAxisSpacing: 10,
        /// 非滚动方向上的元素之间的间距
        crossAxisSpacing: 10,
        /// 滚动方向上的元素的长度(垂直滚动则此参数用于指定网格内元素的高度;水平滚动则此参数用于指定网格内元素的宽度)
        mainAxisExtent: 150,
        /// 如果不指定 mainAxisExtent 则以 childAspectRatio 为准,关于 childAspectRatio 的说明上面已经讲过了
        /// childAspectRatio: 1,
      ),
      /// 滚动方向 vertical 或 horizontal
      scrollDirection: Axis.vertical,
      /// 网格控件本身的内间距
      padding: const EdgeInsets.all(10),

      /// 用于指定网格中的元素数量
      itemCount: _myList.length,
      /// 用于构造网格中的每个元素
      itemBuilder: _getItem,
    );
  }
}

class _Demo3 extends StatelessWidget {

  final Random _random = Random();
  late final List<_MyModel> _myList;

  _Demo3({Key? key}) : super(key: key) {
    _myList = [for (var i = 0; i < 50; i++) _MyModel(name: "webabcd: $i", age: _random.nextInt(100))];
  }

  Widget _getItem(BuildContext context, int index) {
    return Container(
      color: Colors.green,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          MyTextSmall(_myList[index].name),
          MyTextSmall(_myList[index].age.toString()),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    /// GridView.builder() - 根据数据源动态生成对应的网格元素
    return GridView.builder(
      gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
        /// 非滚动方向上的元素的最大长度
        /// 比如垂直滚动时,此参数用于指定水平方向上的元素的最大宽度,然后 GridView 会按此要求最终给元素一个合适的宽度
        maxCrossAxisExtent: 100,
        /// 滚动方向上的元素之间的间距
        mainAxisSpacing: 10,
        /// 非滚动方向上的元素之间的间距
        crossAxisSpacing: 10,
        /// 滚动方向上的元素的长度(垂直滚动则此参数用于指定网格内元素的高度;水平滚动则此参数用于指定网格内元素的宽度)
        mainAxisExtent: 150,
        /// 如果不指定 mainAxisExtent 则以 childAspectRatio 为准,关于 childAspectRatio 的说明上面已经讲过了
        /// childAspectRatio: 1,
      ),
      /// 滚动方向 vertical 或 horizontal
      scrollDirection: Axis.vertical,
      /// 网格控件本身的内间距
      padding: const EdgeInsets.all(10),

      /// 用于指定网格中的元素数量
      itemCount: _myList.length,
      /// 用于构造网格中的每个元素
      itemBuilder: _getItem,
    );
  }
}

class _MyModel {
  const _MyModel({required this.name, required this.age});
  final String name;
  final int age;
}

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

标签:widget,GridView,Container,color,元素,网格,Colors,滚动,flutter
From: https://www.cnblogs.com/webabcd/p/flutter_lib_widget_list_grid_view.html

相关文章

  • Qt之QTableWidget的使用
    #ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QtWidgets>#include<QDebug>#include<QJsonArray>#include<QJsonObject>#include<QJsonValue>#include<QJsonDocument>#defineTABLE_HEADER_STYLE"QHeaderVie......
  • Flutter/React native/un-app
    Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。[5] Flutter开源、免费,拥有宽松的开源协议,适合商业项目。Flutter可以方便的加入现有的工程中。在全世界,Flutter正在被越来越多的开发者和组织使......
  • Flutter和小程序容器技术,全新的小程序解决方案
    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。它也是构建未来的GoogleFuchsia应用的主要方式。什么是Flutter?Flutter是一种......
  • Flutter升级错误
    升级一个老项目,用的是flutter,升级完了一直报错:/C:/Users/***/AppData/Local/Pub/Cache/hosted/pub.flutter-io.cn/file-6.1.2/lib/src/interface/file.dart:15:16:Error:Themethod'File.create'hasfewernamedargumentsthanthoseofoverriddenmethod'File.create......
  • QTableWidget获取列(行)索引方法
    //获取指定的列索引集合QList<int>QcViewBaseForm::getSelectedColumns(QTableWidget*tableWidget){QList<int>selectedColumns;QList<QTableWidgetSelectionRange>selectedRanges=tableWidget->selectedRanges();for(autorange:selec......
  • Flutter实现直播间礼物收发
    下面是一个简单的礼物发送系统的实现代码,包括支持连送和单次送等功能:import'package:flutter/material.dart';classGift{finalStringname;finalintcount;Gift(this.name,this.count);}classGiftSendingScreenextendsStatefulWidget{constGiftSendin......
  • flutter实现下拉刷新和加载更多
    问题背景移动端日常开发过程中,下拉刷新和加载更多是很常见的功能点,现在一起看下flutter是如何实现下拉刷新和加载更多的。问题分析1、通过Dio框架获取网络请求varurl="http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=$_page";Respo......
  • 一统天下 flutter - widget 列表类: ExpansionTile - 列表项(可展开)
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget列表类:ExpansionTile-列表项(可展开)示例如下:lib\widget\list\expansion_tile.dart/**ExpansionTile-列表项(可展开)*/import'package:flutter/material.dart'......
  • 一统天下 flutter - widget 状态管理: 状态管理 - 自定义 controller
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget状态管理:状态管理-自定义controller示例如下:lib\state\controller.dart/**状态管理-自定义controller**为自定义组件指定一个自定义controller后,就可......
  • 一统天下 flutter - 插件: flutter 与 android 原生之间的数据通信
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-插件:flutter与android原生之间的数据通信示例如下:lib\plugin\plugin.dart/**插件*本例用于演示flutter与android/ios原生之间的数据通信**一、android插件......