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<StatefulWidget> createState() {
    return new DragAbleGridViewDemoState();
  }
 
}
 
class DragAbleGridViewDemoState extends State<DragAbleGridViewDemo>{
 
  List<ItemBin> 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: <Widget>[
          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<T>
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;
————————————————
版权声明:本文为CSDN博主「baoolong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baoolong/article/details/86620109

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值