Flutter网格布局插件grid_paper的使用

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

Flutter网格布局插件grid_paper的使用

简介

grid_paper 是一个在 Flutter 中实现可滚动和可缩放网格布局的插件。通过该插件,你可以轻松地创建带有网格背景的应用界面。

说明:这是一个滚动和缩放的网格图案。


项目说明

该项目是一个由 Flutter Bounty Hunters 发起的概念验证项目。如果你希望增加更多的图案或功能,请考虑资助一个里程碑。


使用示例

基本用法

GridPaper 示例

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    return GridPaper(
      gridUnitSize: 25, // 网格单元大小
      originAlignment: Alignment.center, // 网格原点对齐方式
      background: Colors.blueAccent, // 背景颜色
      gridColor: Colors.white, // 网格颜色
    );
  }
}

DotMatrixPaper 示例

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    return DotMatrixPaper(
      gridUnitSize: 25, // 网格单元大小
      originAlignment: Alignment.center, // 网格原点对齐方式
      background: const Color(0xFF444444), // 背景颜色
      style: const DotMatrixStyle.standard().copyWith(divider: DotMatrixDivider.cross), // 点阵样式
    );
  }
}

完整示例

以下是一个完整的示例,展示了如何使用 grid_paper 插件来创建一个包含滚动和缩放功能的网格布局。

main.dart

import 'package:floating_action_bubble/floating_action_bubble.dart';
import 'package:flutter/material.dart' hide GridPaper;
import 'package:grid_paper/grid_paper.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Grid Paper Demo',
      home: MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  late final Animation<double> _animation;
  late final AnimationController _animationController;

  _Demo _demoPage = _Demo.gridPaper;

  Offset _panOffset = Offset.zero;
  double _zoomPercent = 1.0;

  [@override](/user/override)
  void initState() {
    super.initState();

    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 260),
    );

    final curvedAnimation = CurvedAnimation(curve: Curves.easeInOut, parent: _animationController);
    _animation = Tween<double>(begin: 0, end: 1).animate(curvedAnimation);
  }

  void _showDemo(_Demo demo) {
    if (demo == _demoPage) {
      return;
    }

    setState(() {
      _demoPage = demo;
    });
  }

  void _onPanUpdate(DragUpdateDetails details) {
    setState(() {
      _panOffset -= details.delta;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onPanUpdate: _onPanUpdate,
        child: Stack(
          children: [
            _buildDemo(), // 显示当前选择的演示页面
            _buildLabel(), // 显示标签
            Align(
              alignment: Alignment.centerLeft,
              child: SizedBox(
                width: 50,
                child: RotatedBox(
                  quarterTurns: -1,
                  child: SizedBox(
                    width: 200,
                    child: Slider(
                      value: _zoomPercent,
                      min: 0.1,
                      max: 3.0,
                      thumbColor: Colors.white,
                      activeColor: Colors.white.withOpacity(0.8),
                      inactiveColor: Colors.white.withOpacity(0.5),
                      onChanged: (double value) {
                        setState(() {
                          _zoomPercent = value;
                        });
                      },
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
      floatingActionButton: _buildFab(), // 浮动按钮
    );
  }

  Widget _buildDemo() {
    switch (_demoPage) {
      case _Demo.gridPaper:
        return GridPaper(
          panOffset: _panOffset, // 平移偏移量
          zoomPercent: _zoomPercent, // 缩放百分比
          gridUnitSize: 25, // 网格单元大小
          originAlignment: Alignment.center, // 网格原点对齐方式
          background: Colors.blueAccent, // 背景颜色
          gridColor: Colors.white, // 网格颜色
        );
      case _Demo.dotMatrix:
        return DotMatrixPaper(
          panOffset: _panOffset, // 平移偏移量
          zoomPercent: _zoomPercent, // 缩放百分比
          gridUnitSize: 25, // 网格单元大小
          originAlignment: Alignment.center, // 网格原点对齐方式
          background: const Color(0xFF444444), // 背景颜色
          style: const DotMatrixStyle.standard().copyWith(divider: DotMatrixDivider.cross), // 点阵样式
        );
    }
  }

  Widget _buildLabel() {
    late final String labelName;
    switch (_demoPage) {
      case _Demo.gridPaper:
        labelName = "Grid Paper";
        break;
      case _Demo.dotMatrix:
        labelName = "Dot Matrix";
        break;
    }

    return Positioned.fill(
      child: Align(
        alignment: Alignment.center,
        child: Transform.translate(
          offset: -_panOffset,
          child: FractionalTranslation(
            translation: const Offset(0.65, -1.2),
            child: Text(
              labelName,
              style: const TextStyle(
                color: Colors.white,
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildFab() {
    return FloatingActionBubble(
      items: <Bubble>[
        Bubble(
          title: "Grid Paper",
          iconColor: Colors.black,
          bubbleColor: Colors.white,
          icon: Icons.architecture,
          titleStyle: const TextStyle(fontSize: 16, color: Colors.black),
          onPress: () {
            _showDemo(_Demo.gridPaper);
            _animationController.reverse();
          },
        ),
        Bubble(
          title: "Dot Matrix",
          iconColor: Colors.black,
          bubbleColor: Colors.white,
          icon: Icons.share,
          titleStyle: const TextStyle(fontSize: 16, color: Colors.black),
          onPress: () {
            _showDemo(_Demo.dotMatrix);
            _animationController.reverse();
          },
        ),
      ],
      iconColor: Colors.black,
      iconData: Icons.menu,
      backGroundColor: Colors.white,
      animation: _animation,
      onPress: () => _animationController.isCompleted ? _animationController.reverse() : _animationController.forward(),
    );
  }
}

enum _Demo {
  gridPaper,
  dotMatrix,
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用grid_paper插件来创建网格布局的示例代码。grid_paper插件主要用于在开发过程中可视化网格布局,帮助开发者更直观地理解布局结构。

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

dependencies:
  flutter:
    sdk: flutter
  grid_paper: ^1.6.0  # 请根据需要替换为最新版本

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

接下来是一个完整的示例代码,展示了如何使用GridPaper来创建一个简单的网格布局:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Grid Paper Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: GridPaperExample(),
    );
  }
}

class GridPaperExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Grid Paper Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 4, // 每行4列
            crossAxisSpacing: 4.0, // 列间距
            mainAxisSpacing: 4.0, // 行间距
          ),
          itemCount: 20, // 总共20个格子
          itemBuilder: (BuildContext context, int index) {
            return GridTile(
              child: GridPaper(
                color: Colors.grey[200]!,
                intervals: 10, // 网格线间隔
                subdivisions: 4, // 每个间隔内的细分
                child: Center(
                  child: Text(
                    'Item $index',
                    style: TextStyle(fontSize: 18),
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

代码解释

  1. 添加依赖:在pubspec.yaml中添加grid_paper依赖。
  2. 创建应用MyApp是应用的根widget,它创建了一个MaterialApp,并设置了应用的主题和主页。
  3. 主页布局GridPaperExample是主页的widget,它使用Scaffold来创建一个带有AppBar的布局。
  4. 网格视图:使用GridView.builder来创建一个网格视图。gridDelegate定义了网格的布局参数,如每行的列数、列间距和行间距。
  5. 网格项itemBuilder定义了每个网格项的内容。这里使用GridTile来包裹GridPaperGridPaper用于显示网格线。每个网格项中还包含一个居中的文本,显示项的索引。

运行这个示例代码,你会看到一个4列的网格布局,每个网格项内部都有细分的网格线,以及居中的文本标签。这有助于你更好地理解网格布局的结构和间距。

回到顶部