hello 今天为大家介绍一款可拖拽控件GragableGridview,先看效果图
怎么样!长按即可触发编辑效果,当然,你也可以通过按钮来触发编辑,点击红色的叉叉图标即可删除Item,由于源码太复杂,导致我现在也看不懂,我目前正在修改,加备注,以后给大家讲解代码,我们先看看怎么使用它吧
第一步:将以下代码添加到 pubspec.yaml 文件里
dependencies:
dragablegridview_flutter: ^0.1.3
第二步:在你要使用控件的文件里进行导包
import 'package:dragablegridview_flutter/dragablegridview_flutter.dart';
第三步:你的 GridView 数据承载类Bin 必须继承 DragAbleGridViewBin;在你的Bin文件导包
import 'package:dragablegridview_flutter/dragablegridviewbin.dart';
第四步:实现你的业务(以下都是我写的示例代码)
Bin类示例,要什么变量添加就行,不用管继承的变量
import 'package:dragablegridview_flutter/dragablegridviewbin.dart';
class ItemBin extends DragAbleGridViewBin{
ItemBin( this.data);
String data;
@override
String toString() {
return 'ItemBin{data: $data, dragPointX: $dragPointX, dragPointY: $dragPointY, lastTimePositionX: $lastTimePositionX, lastTimePositionY: $lastTimePositionY, containerKey: $containerKey, containerKeyChild: $containerKeyChild, isLongPress: $isLongPress, dragAble: $dragAble}';
}
}
Weidget 示例,使用很简单的,一看就懂
import 'package:dragablegridview_flutter/dragablegridview_flutter.dart';
import 'package:flutter/material.dart';
import 'gridviewitembin.dart';
class DragAbleGridViewDemo extends StatefulWidget{
@override
State createState() {
return new DragAbleGridViewDemoState();
}
}
class DragAbleGridViewDemoState extends State{
List itemBins=new List();
String actionTxtEdit="编辑";
String actionTxtComplete="完成";
String actionTxt;
var editSwitchController=EditSwitchController();
@override
void initState() {
super.initState();
actionTxt=actionTxtEdit;
itemBins.add(new ItemBin("鲁班"));
itemBins.add(new ItemBin("虞姬"));
itemBins.add(new ItemBin("甄姬"));
itemBins.add(new ItemBin("黄盖"));
itemBins.add(new ItemBin("张飞"));
itemBins.add(new ItemBin("关羽"));
itemBins.add(new ItemBin("刘备"));
itemBins.add(new ItemBin("曹操"));
itemBins.add(new ItemBin("赵云"));
itemBins.add(new ItemBin("孙策"));
itemBins.add(new ItemBin("庄周"));
itemBins.add(new ItemBin("廉颇"));
itemBins.add(new ItemBin("后裔"));
itemBins.add(new ItemBin("妲己"));
itemBins.add(new ItemBin("荆轲"));
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("可拖拽GridView"),
actions: [
new Center(
child: new GestureDetector(
child: new Container(
child: new Text(actionTxt,style: TextStyle(fontSize: 19.0),),
margin: EdgeInsets.only(right: 12),
),
onTap: (){
changeActionState();
editSwitchController.editStateChanged();
},
)
)
],
),
body: new DragAbleGridView(
decoration: new BoxDecoration(
borderRadius: BorderRadius.all(new Radius.circular(3.0)),
border: new Border.all(color: Colors.blue),
),
mainAxisSpacing:10.0,
crossAxisSpacing:10.0,
deleteIconName: "images/close.png",
deleteIconMarginTopAndRight: 6.0,
itemPadding: EdgeInsets.fromLTRB(8.0, 5.0, 8.0, 5.0),
childAspectRatio:1.8,
crossAxisCount: 4,
itemBins:itemBins,
editSwitchController:editSwitchController,
child: (int position){
return new Text(
itemBins[position].data,
style: new TextStyle(fontSize: 16.0,color: Colors.blue),);
},
editChangeListener: (){
changeActionState();
},
),
);
}
void changeActionState(){
if(actionTxt==actionTxtEdit){
setState(() {
actionTxt=actionTxtComplete;
});
}else{
setState(() {
actionTxt=actionTxtEdit;
});
}
}
}
完成上面4步,你的dragableGridView已经可以动了,还是蛮简单的,但是变量还是要介绍的,毕竟我写的变量名只有我自己能看懂是上面意思
child | GridView的子控件下面的子控件(比较绕哈),可能是一个Text,也可能是一个Image |
itemBins | item的数据信息,List |
crossAxisCount | GridView一行显示几个child |
childAspectRatio | child的纵横比 |
mainAxisSpacing | 滑动方向child之间的空隙 |
crossAxisSpacing | 和滑动方向垂直的那个方向上 child之间的空隙 |
itemPadding | child的pading |
decoration | GridView的child的装饰(因为它的child是个Container) |
deleteIconSize | 删除图标的大小 |
deleteIconMarginTopAndRight | 删除图标margin top 和 margin right 的值,因为不设置的话,图标位置感觉不太对 |
deleteIconName | 删除图标的name 例如 images/close.png |
editSwitchController | 编辑开关控制器,可通过点击按钮触发编辑 |
editChangeListener | 长按触发编辑状态,可监听状态来改变编辑按钮(编辑开关 ,通过按钮触发编辑)的状态 |
变量就上面的,应该能满足大家的需求,如果这都不能满足,或者你有更好的意见,欢迎留言哈,代码我完善厚,会补上的
如果在使用的过程中有什么问题,也请留言,随时为你解答,
最后附上源码地址:https://github.com/OpenFlutter/PullToRefresh;
里面有很多更酷的控件,欢迎Star;如果喜欢Flutter,可以加入我们哦,我们的QQ群是 :892398530