IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter--拖拽组件(支持多组数据) -> 正文阅读

[移动开发]Flutter--拖拽组件(支持多组数据)


import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';


class DragGridView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _DragGridState();

}

class _DragGridState extends State<DragGridView> {
  
  Map<String, List<String>> data = {
    "List A" : ['A1', 'A2', 'A3', 'A4','A5','A6','A7','A8','A9'],
    "List B" : ['B1', 'B2', 'B3', 'B4','B5','B6','B7','B8','B9'],
  };
  
  String movingValue;

  @override
  Widget build(BuildContext context) {
    List<Widget> children = [];

    data.forEach((key, list) {
      children.add(Text(key));
      children.add(GridView(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 3,
              mainAxisSpacing: 5.0,
              crossAxisSpacing: 5.0,
              childAspectRatio: 1),
          children: buildItems(list),
          physics: NeverScrollableScrollPhysics(),
          shrinkWrap: true
      ));
      children.add(SizedBox(height: 20,));
    });

    return Scaffold(
      appBar: AppBar(title: Text('Draggable Demo')),
      body: SingleChildScrollView(
        child: Center(
          child: Column(children: children),
        ),
      ),
    );
  }

  // 生成GridView的items
  List<Widget> buildItems(List list) {
    List<Widget> items = [];
    for (String title in list)  {
      items.add(Center(child: draggableItem(title),));
    }
    return items;
  }

  // 生成可拖动的item
  Widget draggableItem(value) {
    return Draggable(
      data: value,
      child: DragTarget(
        builder: (context, candidateData, rejectedData) {
          return baseItem(value);
        },
        onWillAccept: (moveData) {
          var accept = moveData != null;
          if (accept) {
            exchangeItem(moveData, value, false);
          }
          return accept;
        },
        onAccept: (moveData) {
          exchangeItem(moveData, value, true);
        },
      ),
      feedback: baseItem(value),
      childWhenDragging: null,
      onDragStarted: () {
        setState(() {
          movingValue = value;//记录开始拖拽的数据
        });
      },
      onDraggableCanceled: (Velocity velocity, Offset offset) {
        setState(() {
          movingValue = null;//清空标记进行重绘
        });
      },
    );
  }

  
  Widget baseItem(value) {
    if (value == movingValue) {
      return Container();
    }
    return Container(
      width: 110,
      height: 110,
      color: Colors.blue,
      child: Center(
        child: Text(
          value,
          textAlign: TextAlign.center,
          style: TextStyle(
              fontWeight: FontWeight.bold,
              fontSize: 20,
              color: Colors.yellowAccent),
        ),
      ),
    );
  }

  // 重新排序
  void exchangeItem(moveData, toData, onAccept) {
    setState(() {
      for (List<String> list in data.values) {
        if (list.contains(moveData)) {
          if (list.contains(toData)) {
            int toIndex = list.indexOf(toData);
            list.remove(moveData);
            list.insert(toIndex, moveData);
          } else {
            var toList = [];
            for (var value in data.values) {
              if (value.contains(toData)) {
                toList = value;
                break;
              }
            }
            int toIndex = toList.indexOf(toData);
            list.remove(moveData);
            toList.insert(toIndex, moveData);
          }
          break;
        }
      }

      if (onAccept) {
        movingValue = null;
      }
    });
  }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:08:36  更:2022-01-08 14:10:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:38:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码