Flutter拖拽网格布局插件dragablegridview_flutter的使用
插件简介
dragablegridview_flutter
是一个基于 GridView
实现的可拖动排序布局组件。用户可以通过长按某个项目触发拖动操作,释放手指后即可完成排序。此外,该插件还支持删除动画,用户可以根据需求选择是否启用拖动动画或删除动画。
GitHub 地址:
https://github.com/baoolong/DragableGridview
效果展示:
dragablegridview_flutter的使用步骤
1. 添加依赖
在项目的 pubspec.yaml
文件中添加以下依赖:
dependencies:
dragablegridview_flutter: ^0.2.5
然后运行 flutter pub get
更新依赖。
2. 导入包
在 Dart 文件中导入以下包:
import 'package:dragablegridview_flutter/dragablegridview_flutter.dart';
import 'package:dragablegridview_flutter/dragablegridviewbin.dart';
3. 创建数据模型
数据模型必须继承自 DragAbleGridViewBin
,用于存储每个项目的详细信息。
import 'package:dragablegridview_flutter/dragablegridviewbin.dart';
class ItemBin extends DragAbleGridViewBin {
ItemBin(this.data);
final String data;
[@override](/user/override)
String toString() {
return 'ItemBin{data: $data, '
'dragPointX: $dragPointX, dragPointY: $dragPointY, '
'lastTimePositionX: $lastTimePositionX, lastTimePositionY: $lastTimePositionY, '
'containerKey: $containerKey, containerKeyChild: $containerKeyChild, '
'isLongPress: $isLongPress, dragAble: $dragAble}';
}
}
示例代码
以下是一个完整的示例代码,展示了如何使用 dragablegridview_flutter
实现拖拽网格布局。
import 'package:flutter/material.dart';
import 'package:dragablegridview_flutter/dragablegridview_flutter.dart';
import 'package:dragablegridview_flutter/dragablegridviewbin.dart';
// 数据模型类
class ItemBin extends DragAbleGridViewBin {
ItemBin(this.data);
final String data;
[@override](/user/override)
String toString() {
return 'ItemBin{data: $data, '
'dragPointX: $dragPointX, dragPointY: $dragPointY, '
'lastTimePositionX: $lastTimePositionX, lastTimePositionY: $lastTimePositionY, '
'containerKey: $containerKey, containerKeyChild: $containerKeyChild, '
'isLongPress: $isLongPress, dragAble: $dragAble}';
}
}
// 主页面
class DragAbleGridViewDemo extends StatefulWidget {
[@override](/user/override)
State<StatefulWidget> createState() {
return new DragAbleGridViewDemoState();
}
}
class DragAbleGridViewDemoState extends State<DragAbleGridViewDemo> {
List<ItemBin> itemBins = [];
String actionTxtEdit = "编辑";
String actionTxtComplete = "完成";
String actionTxt;
var editSwitchController = EditSwitchController();
final List<String> heroes = [
"鲁班", "虞姬", "甄姬", "黄盖", "张飞", "关羽", "刘备", "曹操", "赵云",
"孙策", "庄周", "廉颇", "后裔", "妲己", "荆轲"
];
[@override](/user/override)
void initState() {
super.initState();
actionTxt = actionTxtEdit;
heroes.forEach((heroName) {
itemBins.add(new ItemBin(heroName));
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("可拖拽GridView"),
actions: <Widget>[
Center(
child: GestureDetector(
child: Container(
child: Text(actionTxt, style: TextStyle(fontSize: 19.0)),
margin: EdgeInsets.only(right: 12),
),
onTap: () {
changeActionState();
editSwitchController.editStateChanged();
},
),
)
],
),
body: DragAbleGridView(
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 1.8,
crossAxisCount: 4,
itemBins: itemBins,
editSwitchController: editSwitchController,
// 新增参数
isOpenDragAble: true,
animationDuration: 300, // 动画持续时间(毫秒)
longPressDuration: 800, // 长按触发拖动的时长(毫秒)
deleteIcon: Image.asset(
"images/close.png",
width: 15.0,
height: 15.0,
),
child: (int position) {
return Container(
padding: EdgeInsets.fromLTRB(8.0, 5.0, 8.0, 5.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(3.0)),
border: Border.all(color: Colors.blue),
),
// 设置删除图标的位置
margin: EdgeInsets.only(top: 6.0, right: 6.0),
child: Text(
itemBins[position].data,
style: TextStyle(fontSize: 16.0, color: Colors.blue),
),
);
},
editChangeListener: () {
changeActionState();
},
),
);
}
void changeActionState() {
if (actionTxt == actionTxtEdit) {
setState(() {
actionTxt = actionTxtComplete;
});
} else {
setState(() {
actionTxt = actionTxtEdit;
});
}
}
}
更多关于Flutter拖拽网格布局插件dragablegridview_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter拖拽网格布局插件dragablegridview_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
dragablegridview_flutter
是一个用于在 Flutter 中实现可拖拽网格布局的插件。它允许用户通过拖拽来重新排列网格中的项目。以下是如何使用这个插件的基本步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 dragablegridview_flutter
插件的依赖。
dependencies:
flutter:
sdk: flutter
dragablegridview_flutter: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入包
在你的 Dart 文件中导入 dragablegridview_flutter
包。
import 'package:dragablegridview_flutter/dragablegridview_flutter.dart';
3. 使用 DraggableGridView
DraggableGridView
是 dragablegridview_flutter
插件中的主要组件。你可以通过以下方式使用它:
class MyHomePage extends StatefulWidget {
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<String> items = List.generate(20, (index) => 'Item ${index + 1}');
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Draggable GridView'),
),
body: DraggableGridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, // 每行显示3个item
crossAxisSpacing: 10.0,
mainAxisSpacing: 10.0,
),
children: items.map((item) {
return Card(
child: Center(
child: Text(item),
),
);
}).toList(),
onReorder: (int oldIndex, int newIndex) {
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final String item = items.removeAt(oldIndex);
items.insert(newIndex, item);
});
},
),
);
}
}
4. 解释代码
items
: 这是一个包含网格项数据的列表。DraggableGridView
: 这是插件提供的主要组件,用于创建可拖拽的网格布局。gridDelegate
: 用于定义网格的布局,例如每行显示多少个项目。children
: 这是网格中的子项列表,通常是一个Widget
列表。onReorder
: 这是一个回调函数,当用户拖拽并重新排列项目时触发。它接收两个参数:oldIndex
和newIndex
,分别表示拖拽前和拖拽后的索引。
5. 运行应用
现在你可以运行你的 Flutter 应用,并尝试拖拽网格中的项目来重新排列它们。
6. 自定义
你可以根据需要自定义 DraggableGridView
的外观和行为。例如,你可以更改网格的列数、间距、以及每个项目的样式。
7. 注意事项
- 确保
items
列表中的项目数量足够多,以便在网格中显示多个项目。 onReorder
回调函数中的逻辑用于更新items
列表的顺序,确保在setState
中调用以更新 UI。
8. 示例代码
以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:dragablegridview_flutter/dragablegridview_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Draggable GridView Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<String> items = List.generate(20, (index) => 'Item ${index + 1}');
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Draggable GridView'),
),
body: DraggableGridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 10.0,
mainAxisSpacing: 10.0,
),
children: items.map((item) {
return Card(
child: Center(
child: Text(item),
),
);
}).toList(),
onReorder: (int oldIndex, int newIndex) {
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final String item = items.removeAt(oldIndex);
items.insert(newIndex, item);
});
},
),
);
}
}