Flutter网格布局插件eazigrid的使用

Flutter网格布局插件eazigrid的使用

简介

EAZI GRID

Easy dynamic Flutter row to list/grid. Starts out as a row and resizes to a grid - scaling to dimensions of parent widget.

特性

  • 父组件宽度必须明确指定。
  • 如果父组件高度未指定,则高度会自动缩放以适应父组件。
  • 如果将参数 isScrollable 设置为 true,则子项可以垂直滚动。

开始使用

pubspec.yaml 文件中添加依赖包:

dependencies:
  flutter:
    sdk: flutter

  ...
  eazigrid: ^[latest_version]

为了处理自动化测试中的溢出问题,在主方法中添加以下行:

EaziGridFlowHandler.handleEaziError();

使用示例

ezgif com-gif-maker

在父组件中声明 EaziGrid,并确保其宽度不为无穷大(见示例):

EaziGrid(
  isScrollable: true,
  horizontalAlignment: EaziAlignment.start,
  children: [
    for(int i=0; i<=widget.totalItems; i++)
      TestGridItem(itemIndex: i)
  ]
)

组件参数

  • isScrollable: 如果设置为 true,则生成的网格可垂直滚动。
  • horizontalAlignment: 通过 EaziAlignment 中定义的选项来对齐每一行的子项。
  • verticalAlignment: 通过 EaziAlignment 中定义的选项来对齐网格行。
  • children: 所有子项必须是具有显式高度和宽度的小部件。
enum EaziAlignment { start, center, end }

其他信息

欢迎提交问题以请求新功能。如果您想贡献代码,请发送一个 Pull Request。

TODO: 🤔 HAVE FUN 😬


完整示例代码

import 'package:eazigrid/eazigrid.dart';
import 'package:flutter/material.dart';

void main() {
  EaziGridFlowHandler.handleEaziError();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'EaziGrid Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Eazigrid Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title, this.totalItems = 30}) : super(key: key);

  final String title;
  final double totalItems;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: OverflowBox(
        child: Column(children: [
          Expanded(
            child: EaziGrid(
              isScrollable: true,
              horizontalAlignment: EaziAlignment.start,
              children: [
                for (int i = 0; i <= widget.totalItems; i++)
                  TestGridItem(itemIndex: i)
              ],
            ),
          ),
          Text(
            'EaziGrid',
            style: TextStyle(fontSize: 30),
          )
        ]),
      ),
    );
  }
}

class TestGridItem extends StatelessWidget {
  const TestGridItem({
    Key? key,
    required this.itemIndex,
  }) : super(key: key);

  final int itemIndex;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
          color: Colors.blue, borderRadius: BorderRadius.circular(8)),
      margin: EdgeInsets.all(10),
      padding: EdgeInsets.all(10),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Icon(
            Icons.description,
            color: Colors.white,
          ),
          const SizedBox(
            height: 5,
          ),
          Text(
            '$itemIndex\ntest item',
            textAlign: TextAlign.center,
            style: TextStyle(color: Colors.white),
          )
        ],
      ),
    );
  }
}

更多关于Flutter网格布局插件eazigrid的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网格布局插件eazigrid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


EaziGrid 是一个用于 Flutter 的网格布局插件,它可以帮助开发者轻松地创建复杂的网格布局。以下是 EaziGrid 的基本使用方法和示例。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 eazigrid 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  eazigrid: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 基本使用

EaziGrid 提供了一个 EaziGrid 组件,你可以通过设置 rowscolumns 来定义网格的行和列。每个单元格可以包含任意的小部件。

import 'package:flutter/material.dart';
import 'package:eazigrid/eazigrid.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('EaziGrid Example'),
        ),
        body: EaziGrid(
          rows: 3,
          columns: 3,
          children: List.generate(9, (index) {
            return Container(
              color: Colors.blueAccent,
              child: Center(
                child: Text('Cell $index'),
              ),
            );
          }),
        ),
      ),
    );
  }
}

3. 自定义单元格大小

你可以通过 cellWidthcellHeight 参数来设置每个单元格的宽度和高度。

EaziGrid(
  rows: 3,
  columns: 3,
  cellWidth: 100,
  cellHeight: 100,
  children: List.generate(9, (index) {
    return Container(
      color: Colors.greenAccent,
      child: Center(
        child: Text('Cell $index'),
      ),
    );
  }),
)

4. 跨行和跨列

EaziGrid 还支持跨行和跨列的功能,你可以通过 rowSpancolumnSpan 来设置单元格的跨行和跨列。

EaziGrid(
  rows: 3,
  columns: 3,
  children: [
    Container(color: Colors.red, child: Center(child: Text('Cell 0'))),
    Container(color: Colors.blue, child: Center(child: Text('Cell 1'))),
    EaziGridCell(
      rowSpan: 2,
      columnSpan: 2,
      child: Container(color: Colors.green, child: Center(child: Text('Span'))),
    ),
    Container(color: Colors.yellow, child: Center(child: Text('Cell 3'))),
    Container(color: Colors.purple, child: Center(child: Text('Cell 4'))),
    Container(color: Colors.orange, child: Center(child: Text('Cell 5'))),
    Container(color: Colors.pink, child: Center(child: Text('Cell 6'))),
  ],
)

5. 网格间距

你可以通过 spacing 参数来设置网格之间的间距。

EaziGrid(
  rows: 3,
  columns: 3,
  spacing: 10,
  children: List.generate(9, (index) {
    return Container(
      color: Colors.cyanAccent,
      child: Center(
        child: Text('Cell $index'),
      ),
    );
  }),
)

6. 响应式布局

EaziGrid 还支持响应式布局,你可以通过 aspectRatio 参数来设置单元格的宽高比。

EaziGrid(
  rows: 3,
  columns: 3,
  aspectRatio: 1.5,
  children: List.generate(9, (index) {
    return Container(
      color: Colors.tealAccent,
      child: Center(
        child: Text('Cell $index'),
      ),
    );
  }),
)
回到顶部