Flutter拖拽排序网格视图插件drag_and_drop_gridview的使用

Flutter拖拽排序网格视图插件drag_and_drop_gridview的使用

概述

drag_and_drop_gridview 是一个强大的 Flutter 插件,它扩展了 GridView 的功能,允许用户通过简单的拖放操作对网格视图中的项目进行重新排序。此插件易于实现且界面美观。

如果你喜欢本内容,请支持项目的可见性,点赞、收藏或赞赏!


使用方法

1. 添加依赖

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  drag_and_drop_gridview: ^1.0.8

然后在代码中导入该包:

import 'package:drag_and_drop_gridview/devdrag.dart';

示例代码

示例 1: 基本用法
import 'package:drag_and_drop_gridview/devdrag.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Drag And Drop GridView')),
        body: DragAndDropGridView(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            childAspectRatio: 3 / 4.5,
          ),
          padding: EdgeInsets.all(20),
          itemBuilder: (context, index) => Card(
            elevation: 2,
            child: Text('Item $index'),
          ),
          itemCount: 10,
          onWillAccept: (oldIndex, newIndex) => true,
          onReorder: (oldIndex, newIndex) {
            print('Old Index: $oldIndex, New Index: $newIndex');
          },
        ),
      ),
    );
  }
}

结果: DragAndDropGridView


示例 2: 水平方向可重排
import 'package:drag_and_drop_gridview/devdrag.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Horizontal Drag And Drop GridView')),
        body: DragAndDropGridView.horizontal(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 5,
            childAspectRatio: 3 / 4.5,
          ),
          padding: EdgeInsets.all(20),
          itemBuilder: (context, index) => Card(
            elevation: 2,
            child: Text('Item $index'),
          ),
          itemCount: 10,
          onWillAccept: (oldIndex, newIndex) => true,
          onReorder: (oldIndex, newIndex) {
            print('Old Index: $oldIndex, New Index: $newIndex');
          },
        ),
      ),
    );
  }
}

结果: HorGrid


示例 3: 垂直方向可重排
import 'package:drag_and_drop_gridview/devdrag.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Vertical Drag And Drop GridView')),
        body: DragAndDropGridView(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            childAspectRatio: 3 / 4.5,
          ),
          padding: EdgeInsets.all(20),
          itemBuilder: (context, index) => Card(
            elevation: 2,
            child: Text('Item $index'),
          ),
          itemCount: 10,
          onWillAccept: (oldIndex, newIndex) => true,
          onReorder: (oldIndex, newIndex) {
            print('Old Index: $oldIndex, New Index: $newIndex');
          },
        ),
      ),
    );
  }
}

结果: ReorderableGrid


参数详解

gridDelegate

定义网格布局的方式,例如列数和宽高比。

gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  crossAxisCount: 2,
  childAspectRatio: 3 / 4.5,
),
itemBuilder

用于生成每个网格项的子部件。

itemBuilder: (context, index) => Card(
  elevation: 2,
  child: Text('Item $index'),
),
onWillAccept

验证是否接受拖动目标。

onWillAccept: (oldIndex, newIndex) {
  if (_imageUris[newIndex] == "something") {
    return false;
  }
  return true;
},
onReorder

处理重新排序后的逻辑。

onReorder: (oldIndex, newIndex) {
  final temp = _imageUris[oldIndex];
  _imageUris[oldIndex] = _imageUris[newIndex];
  _imageUris[newIndex] = temp;
  setState(() {});
},

其他功能

1. 非粘性头部
header: Container(
  height: 50,
  width: double.infinity,
  alignment: Alignment.center,
  color: Colors.amber,
  child: Text("Header"),
),
2. 粘性头部(水平)
DragAndDropGridView.horizontalStickyHeader(
  itemBuilderHeader: (context, pos) => Card(
    elevation: 2,
    child: Text("${listOfHeader[pos]}"),
  ),
  headerItemCount: 5,
  ...
)
3. 自定义拖拽反馈
isCustomFeedback: true,
feedback: (pos) => Image.asset("gifs/draganddropbg.jpg"),

更多关于Flutter拖拽排序网格视图插件drag_and_drop_gridview的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


drag_and_drop_gridview 是一个用于在 Flutter 中实现拖拽排序网格视图的插件。它允许用户在网格布局中拖动项目,并重新排列它们的位置。以下是如何在 Flutter 项目中使用 drag_and_drop_gridview 的基本步骤。

1. 添加依赖项

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

dependencies:
  flutter:
    sdk: flutter
  drag_and_drop_gridview: ^1.0.2 # 请检查最新版本

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

2. 导入插件

在你的 Dart 文件中导入 drag_and_drop_gridview 插件:

import 'package:drag_and_drop_gridview/devdrag.dart';

3. 创建可拖拽的网格视图

使用 DragAndDropGridView 组件来创建一个可拖拽的网格视图。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:drag_and_drop_gridview/devdrag.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Drag and Drop GridView Example',
      home: DragAndDropGridViewExample(),
    );
  }
}

class DragAndDropGridViewExample extends StatefulWidget {
  [@override](/user/override)
  _DragAndDropGridViewExampleState createState() =>
      _DragAndDropGridViewExampleState();
}

class _DragAndDropGridViewExampleState extends State<DragAndDropGridViewExample> {
  List<String> items = List.generate(20, (index) => 'Item ${index + 1}');

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Drag and Drop GridView'),
      ),
      body: DragAndDropGridView(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3, // 每行显示的项目数量
          crossAxisSpacing: 8.0,
          mainAxisSpacing: 8.0,
        ),
        padding: EdgeInsets.all(8.0),
        itemBuilder: (context, index) => Card(
          elevation: 2.0,
          child: Center(
            child: Text(items[index]),
          ),
        ),
        itemCount: items.length,
        onWillAccept: (oldIndex, newIndex) {
          // 这里可以添加一些逻辑来决定是否允许拖拽
          return true;
        },
        onReorder: (oldIndex, newIndex) {
          setState(() {
            final item = items.removeAt(oldIndex);
            items.insert(newIndex, item);
          });
        },
      ),
    );
  }
}
回到顶部