Flutter可拖拽控件GragableGridview

hello 今天为大家介绍一款可拖拽控件GragableGridview,先看效果图

怎么样!长按即可触发编辑效果,当然,你也可以通过按钮来触发编辑,点击红色的叉叉图标即可删除Item,由于源码太复杂,导致我现在也看不懂,我目前正在修改,加备注,以后给大家讲解代码,我们先看看怎么使用它吧

Usage 控件使用:

第一步:将以下代码添加到 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
 

你可能感兴趣的:(Flutter)