Flutter交错网格视图插件staggered_grid_view的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter Staggered Grid View

staggered_grid_view 是一个用于创建交错网格布局的灵活且高性能的Flutter包,提供了多种配置选项,适用于固定和动态内容。

特性

  • 交错布局:创建视觉上吸引人的布局,具有可变大小的项目跨越多行和多列。
  • 固定和动态扩展:支持固定大小网格和适应内容大小的网格。
  • 可自定义的代理:使用不同的代理配置布局,如跨轴计数、最大扩展和自定义瓷砖大小。
  • 懒加载:通过延迟子项创建和缓存来高效处理大型数据集。
  • 自动保持活动状态:在滚动过程中平滑过渡的选项。
  • 简单使用:类似于Flutter内置GridView的易于使用的API。

开始使用

安装

将包添加到您的pubspec.yaml文件中:

dependencies:
  staggered_grid_view: ^0.0.11

然后运行 flutter pub get

使用方法

以下是一些基本示例,帮助您开始使用staggered_grid_view插件。

基本交错网格(固定跨轴计数)

import 'package:flutter/material.dart';
import 'package:staggered_grid_view/flutter_staggered_grid_view.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Staggered Grid View')),
        body: StaggeredGridView.count(
          crossAxisCount: 4,
          staggeredTiles: const [
            StaggeredTile.count(2, 2),
            StaggeredTile.count(1, 2),
            StaggeredTile.count(1, 1),
            StaggeredTile.count(1, 2),
            StaggeredTile.count(2, 1),
            StaggeredTile.count(1, 1),
          ],
          children: List.generate(6, (index) => Card(
            color: Colors.blue.shade100,
            child: Center(child: Text('Item $index')),
          )),
        ),
      ),
    );
  }
}

最大跨轴扩展和动态子项的交错网格

import 'package:flutter/material.dart';
import 'package:staggered_grid_view/flutter_staggered_grid_view.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Staggered Grid View')),
        body: StaggeredGridView.extentBuilder(
          maxCrossAxisExtent: 200,
          itemCount: 20,
          staggeredTileBuilder: (index) => StaggeredTile.count(
                (index % 3) + 1, (index % 5) + 1),
          itemBuilder: (context, index) => Card(
              color: Colors.green.shade100,
              child: Center(child: Text('Item $index'))
            ),
        ),
      ),
    );
  }
}

具有构建器的无限项目的交错网格

import 'package:flutter/material.dart';
import 'package:staggered_grid_view/flutter_staggered_grid_view.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Staggered Grid View')),
        body: StaggeredGridView.countBuilder(
          crossAxisCount: 3,
          itemCount: 100,
          staggeredTileBuilder: (index) => StaggeredTile.count(1, 1 + (index % 3)),
          itemBuilder: (context, index) => Card(
              color: Colors.orange.shade100,
              child: Center(child: Text('Item $index'))
            ),
        ),
      ),
    );
  }
}

关键类

  • StaggeredGridView:渲染交错网格的主要部件。
  • StaggeredTile:定义单个网格项在交叉轴和主轴上的大小。
  • SliverStaggeredGridDelegate:创建自定义布局代理的抽象类。
  • SliverStaggeredGridDelegateWithFixedCrossAxisCount:用于定义具有固定跨轴计数的网格布局的具体代理。
  • SliverStaggeredGridDelegateWithMaxCrossAxisExtent:用于定义具有最大跨轴扩展的网格布局的具体代理。

API 概览

更多详细信息,请参阅API文档。该包模仿了GridView的常见API,提供了一些熟悉的参数,如:

  • scrollDirection
  • reverse
  • controller
  • primary
  • physics
  • shrinkWrap
  • padding
  • addAutomaticKeepAlives

以及用于构建交错网格的自定义参数:

  • crossAxisCount:列数。与StaggeredGridView.countStaggeredGridView.countBuilder一起使用。
  • maxCrossAxisExtent:交叉轴上的最大宽度。与StaggeredGridView.extentStaggeredGridView.extentBuilder一起使用。
  • staggeredTilesStaggeredTile列表。与StaggeredGridView.countStaggeredGridView.extent一起使用。
  • staggeredTileBuilder:构建StaggeredTile的函数。与StaggeredGridView.countBuilderStaggeredGridView.extentBuilder一起使用。

示例应用

对于更全面的例子,请参见此仓库中的example文件夹。

贡献

欢迎贡献!请随时提交错误报告、功能请求和拉取请求至GitHub

希望这些示例能帮助您更好地理解和使用staggered_grid_view插件。如果您有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用staggered_grid_view插件来创建交错网格视图的示例代码。这个插件允许你创建一个具有不同行高的网格布局,非常适合用来展示图片画廊或其他内容。

首先,确保你已经在pubspec.yaml文件中添加了flutter_staggered_grid_view依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_staggered_grid_view: ^0.6.1  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来,是一个完整的Flutter应用示例,展示如何使用StaggeredGridView

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Staggered GridView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final List<String> imageUrls = [
    'https://via.placeholder.com/300x200',
    'https://via.placeholder.com/300x400',
    'https://via.placeholder.com/300x300',
    'https://via.placeholder.com/300x500',
    'https://via.placeholder.com/300x150',
    'https://via.placeholder.com/300x250',
    // 添加更多图片URL
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Staggered GridView Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: StaggeredGridView.countBuilder(
          crossAxisCount: 4, // 横轴上的列数
          itemCount: imageUrls.length,
          itemBuilder: (BuildContext context, int index) => Card(
            child: Image.network(imageUrls[index], fit: BoxFit.cover,),
            elevation: 4.0,
            margin: EdgeInsets.only(
              left: 8.0,
              right: 8.0,
              top: 8.0,
              bottom: index == imageUrls.length - 1 ? 8.0 : 0.0, // 最后一行不需要底部间距
            ),
          ),
          staggeredTileBuilder: (int index) =>
              StaggeredTile.count(2, index % 2 == 0 ? 2 : 1), // 根据索引创建不同高度的瓦片
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入:确保在pubspec.yaml中添加了flutter_staggered_grid_view依赖。

  2. 创建应用MyApp是一个无状态小部件,设置了应用的主题和主页。

  3. 主页布局MyHomePage是一个无状态小部件,包含一个Scaffold,其appBar显示了应用的标题,body部分使用Padding小部件来增加内边距。

  4. 交错网格视图StaggeredGridView.countBuilder用于创建交错网格视图。

    • crossAxisCount:横轴上的列数。
    • itemCount:要显示的项目总数。
    • itemBuilder:用于构建每个项目的小部件。在这个例子中,每个项目都是一个Card,里面包含了一张网络图片。
    • staggeredTileBuilder:用于创建每个项目的瓦片(Tile),通过返回StaggeredTile.count来设置不同高度的瓦片。这里根据索引的奇偶性来设置瓦片的高度。

运行这个示例代码,你将看到一个具有交错高度的网格视图,非常适合用来展示图片画廊。根据需要,你可以调整crossAxisCountitemBuilderstaggeredTileBuilder来适应不同的布局和内容。

回到顶部