flutter_staggered_grid_view
是一个提供多种 Flutter 网格布局的库。本教程将帮助你快速上手并使用该库。
在你的 Flutter 项目的 pubspec.yaml
文件中,添加以下依赖:
yamldependencies:
...
flutter_staggered_grid_view: <最新版本>
在你的 Dart 文件中,添加以下导入:
dartimport 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
如果你需要帮助来开始使用 Flutter,可以查看在线文档。
这个库包含了多种网格布局。在接下来的部分中,你将了解每一种布局。为了简化描述,布局的解释将始终考虑从上到下和从左到右的方向。当然,你可以在代码中更改这些方向。
这种布局适用于少量项目。目前还没有找到在 Sliver 上下文中运行的高效算法,因此这不是一个 GridView
,所以也没有 SliverStaggeredGrid
。
dartimport '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( home: Scaffold( appBar: AppBar(title: Text('Staggered Grid Layout')), body: StaggeredGridDemo(), ), ); } } class StaggeredGridDemo extends StatelessWidget { @override Widget build(BuildContext context) { return StaggeredGrid.count( crossAxisCount: 4, mainAxisSpacing: 4, crossAxisSpacing: 4, children: const [ StaggeredGridTile.count( crossAxisCellCount: 2, mainAxisCellCount: 2, child: Tile(index: 0, color: Colors.blue), ), StaggeredGridTile.count( crossAxisCellCount: 2, mainAxisCellCount: 1, child: Tile(index: 1, color: Colors.green), ), StaggeredGridTile.count( crossAxisCellCount: 1, mainAxisCellCount: 1, child: Tile(index: 2, color: Colors.orange), ), StaggeredGridTile.count( crossAxisCellCount: 1, mainAxisCellCount: 1, child: Tile(index: 3, color: Colors.red), ), StaggeredGridTile.count( crossAxisCellCount: 4, mainAxisCellCount: 2, child: Tile(index: 4, color: Colors.purple), ), ], ); } } class Tile extends StatelessWidget { final int index; final Color color; const Tile({required this.index, required this.color}); @override Widget build(BuildContext context) { return Container( color: color, child: Center( child: Text('Tile $index', style: TextStyle(color: Colors.white)), ), ); } }
这种布局便于浏览未裁剪的同等内容。容器的高度根据小部件的大小进行调整。
dartimport '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( home: Scaffold( appBar: AppBar(title: Text('Masonry Grid Layout')), body: MasonryGridDemo(), ), ); } } class MasonryGridDemo extends StatelessWidget { @override Widget build(BuildContext context) { return MasonryGridView.count( crossAxisCount: 4, mainAxisSpacing: 4, crossAxisSpacing: 4, itemCount: 20, itemBuilder: (context, index) { return Tile( index: index, color: Colors.primaries[index % Colors.primaries.length], height: (index % 5 + 1) * 50, ); }, ); } } class Tile extends StatelessWidget { final int index; final Color color; final double height; const Tile({required this.index, required this.color, required this.height}); @override Widget build(BuildContext context) { return Container( color: color, height: height, child: Center( child: Text('Tile $index', style: TextStyle(color: Colors.white)), ), ); } }
这种布局通过不同的容器大小和比例来强调某些项目,从而创建层次结构。
dartimport '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( home: Scaffold( appBar: AppBar(title: Text('Quilted Grid Layout')), body: QuiltedGridDemo(), ), ); } } class QuiltedGridDemo extends StatelessWidget { @override Widget build(BuildContext context) { return GridView.custom( gridDelegate: SliverQuiltedGridDelegate( crossAxisCount: 4, mainAxisSpacing: 4, crossAxisSpacing: 4, repeatPattern: QuiltedGridRepeatPattern.inverted, pattern: [ QuiltedGridTile(2, 2), QuiltedGridTile(1, 1), QuiltedGridTile(1, 1), QuiltedGridTile(1, 2), ], ), childrenDelegate: SliverChildBuilderDelegate( (context, index) => Tile( index: index, color: Colors.primaries[index % Colors.primaries.length], ), childCount: 20, ), ); } } class Tile extends StatelessWidget { final int index; final Color color; const Tile({required this.index, required this.color}); @override Widget build(BuildContext context) { return Container( color: color, child: Center( child: Text('Tile $index', style: TextStyle(color: Colors.white)), ), ); } }
这种布局便于浏览同等内容。项目显示在不同比例的容器中,以创建有节奏的布局。
aspectRatio
(宽高比)定义crossAxisRatio
(宽度/列宽)定义,范围在 0(不包括)到 1(包括)之间dartimport '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( home: Scaffold( appBar: AppBar(title: Text('Quilted Grid Layout')), body: QuiltedGridDemo(), ), ); } } class QuiltedGridDemo extends StatelessWidget { @override Widget build(BuildContext context) { return GridView.custom( gridDelegate: SliverQuiltedGridDelegate( crossAxisCount: 4, mainAxisSpacing: 4, crossAxisSpacing: 4, repeatPattern: QuiltedGridRepeatPattern.inverted, pattern: [ QuiltedGridTile(2, 2), QuiltedGridTile(1, 1), QuiltedGridTile(1, 1), QuiltedGridTile(1, 2), ], ), childrenDelegate: SliverChildBuilderDelegate( (context, index) => Tile( index: index, color: Colors.primaries[index % Colors.primaries.length], ), childCount: 20, ), ); } } class Tile extends StatelessWidget { final int index; final Color color; const Tile({required this.index, required this.color}); @override Widget build(BuildContext context) { return Container( color: color, child: Center( child: Text('Tile $index', style: TextStyle(color: Colors.white)), ), ); } }
这种布局使用交替的容器大小和比例来创建有节奏的效果。它是另一种编织网格布局。
aspectRatio
(宽高比)定义crossAxisRatio
(宽度/可用水平空间)定义,范围在 0(不包括)到 1(包括)之间dartimport '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( home: Scaffold( appBar: AppBar(title: Text('Staired Grid Layout')), body: StairedGridDemo(), ), ); } } class StairedGridDemo extends StatelessWidget { @override Widget build(BuildContext context) { return GridView.custom( gridDelegate: SliverStairedGridDelegate( crossAxisSpacing: 8, mainAxisSpacing: 8, startCrossAxisDirectionReversed: true, pattern: [ StairedGridTile(0.5, 1), // 第一个瓦片:宽度 50%,高度 1 倍 StairedGridTile(0.5, 3 / 4), // 第二个瓦片:宽度 50%,高度 0.75 倍 StairedGridTile(1.0, 10 / 4), // 第三个瓦片:宽度 100%,高度 2.5 倍 ], ), childrenDelegate: SliverChildBuilderDelegate( (context, index) => Tile( index: index, color: Colors.primaries[index % Colors.primaries.length], ), childCount: 20, ), ); } } class Tile extends StatelessWidget { final int index; final Color color; const Tile({required this.index, required this.color}); @override Widget build(BuildContext context) { return Container( color: color, child: Center( child: Text('Tile $index', style: TextStyle(color: Colors.white)), ), ); } }
这种布局也被称为 CSS 网格。这是网页上常见的网格布局,其中每个项目在其轨道内具有与其兄弟项目相同的最大交叉轴范围。
dartimport '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( home: Scaffold( appBar: AppBar(title: Text('Aligned Grid Layout')), body: AlignedGridDemo(), ), ); } } class AlignedGridDemo extends StatelessWidget { @override Widget build(BuildContext context) { return AlignedGridView.count( crossAxisCount: 4, mainAxisSpacing: 4, crossAxisSpacing: 4, itemCount: 20, itemBuilder: (context, index) { return Tile( index: index, color: Colors.primaries[index % Colors.primaries.length], height: (index % 7 + 1) * 30, ); }, ); } } class Tile extends StatelessWidget { final int index; final Color color; final double height; const Tile({required this.index, required this.color, required this.height}); @override Widget build(BuildContext context) { return Container( color: color, height: height, child: Center( child: Text('Tile $index', style: TextStyle(color: Colors.white)), ), ); } }
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!