Flutter拖拽与放置功能插件widget_drag_and_drop_layer的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter拖拽与放置功能插件widget_drag_and_drop_layer的使用

允许在屏幕上显示或隐藏浮动小部件,并且可以将此小部件扩展为全屏。

开始使用

drag_and_drop_pluging: ^0.0.5

示例

示例代码

import 'package:flutter/material.dart';
import 'package:drag_and_drop_pluging/widget_drag_and_drop_layer.dart';

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool isFullScreen = false;
  bool isVisibleButton = true;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('拖拽与放置功能插件示例'),
      ),
      body: Center(
        child: WidgetDragAndDropLayer(
          props: WidgetDragAndDropLayerProps(
            floatingWidget: Container(
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(isFullScreen ? 0 : 16),
                color: Colors.red.shade200,
              ),
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  children: [
                    ElevatedButton(
                      onPressed: () {
                        setState(() {
                          isFullScreen = !isFullScreen;
                        });
                      },
                      child: const Text("按钮一"),
                    ),
                  ],
                ),
              ),
            ),
            content: Container(), // 这里可以替换为你的主要内容
            floatingFullScreen: isFullScreen,
            floatingVisible: isVisibleButton,
          ),
        ),
      ),
    );
  }
}

更多关于Flutter拖拽与放置功能插件widget_drag_and_drop_layer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter拖拽与放置功能插件widget_drag_and_drop_layer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个使用 widget_drag_and_drop_layer 插件实现 Flutter 拖拽与放置功能的示例代码。这个插件允许你在 Flutter 应用中实现拖拽和放置功能。

首先,确保你已经在 pubspec.yaml 文件中添加了 widget_drag_and_drop_layer 依赖:

dependencies:
  flutter:
    sdk: flutter
  widget_drag_and_drop_layer: ^x.y.z  # 请使用最新版本号

然后运行 flutter pub get 来安装依赖。

以下是一个简单的示例,展示了如何使用 widget_drag_and_drop_layer 插件实现基本的拖拽与放置功能:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Drag and Drop Example'),
        ),
        body: DragAndDropDemo(),
      ),
    );
  }
}

class DragAndDropDemo extends StatefulWidget {
  @override
  _DragAndDropDemoState createState() => _DragAndDropDemoState();
}

class _DragAndDropDemoState extends State<DragAndDropDemo> {
  final List<Offset> _itemPositions = [];

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        // Placeholder for drop area
        Positioned(
          top: 50,
          left: 50,
          width: 200,
          height: 200,
          child: Container(
            color: Colors.grey[200],
            child: Center(
              child: Text(
                'Drop here',
                style: TextStyle(color: Colors.black),
              ),
            ),
          ),
        ),
        // Draggable items
        for (var i = 0; i < 5; i++)
          DraggableItem(
            key: ValueKey('draggable_item_$i'),
            position: _itemPositions.length > i ? _itemPositions[i] : Offset(100 + i * 50, 300),
            onDragEnded: (Offset newPosition) {
              setState(() {
                _itemPositions[i] = newPosition;
              });
            },
          ),
      ],
    );
  }
}

class DraggableItem extends StatefulWidget {
  final Offset position;
  final ValueChanged<Offset> onDragEnded;

  const DraggableItem({Key key, @required this.position, @required this.onDragEnded}) : super(key: key);

  @override
  _DraggableItemState createState() => _DraggableItemState();
}

class _DraggableItemState extends State<DraggableItem> {
  Offset _initialPosition;
  Offset _currentPosition = Offset.zero;

  @override
  void initState() {
    super.initState();
    _initialPosition = widget.position;
  }

  void _handleDragUpdate(DragUpdateDetails details) {
    setState(() {
      _currentPosition += details.delta;
    });
  }

  void _handleDragEnd(DragEndDetails details) {
    widget.onDragEnded(_initialPosition + _currentPosition);
    setState(() {
      _currentPosition = Offset.zero;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Positioned(
      left: widget.position.dx + _currentPosition.dx,
      top: widget.position.dy + _currentPosition.dy,
      child: DragTarget<Offset>(
        builder: (BuildContext context, List<Offset> candidateData, List<dynamic> rejectedData) {
          return GestureDetector(
            onPanDown: (DragDownDetails details) {
              final Drag data = Drag(
                data: widget.position,
                feedback: Material(
                  elevation: 4.0,
                  child: Container(
                    width: 50,
                    height: 50,
                    color: Colors.blue,
                    child: Center(child: Text('Item')),
                  ),
                ),
                child: Container(
                  width: 50,
                  height: 50,
                  color: Colors.blue.withOpacity(0.5),
                  child: Center(child: Text('Item')),
                ),
              );
              RenderBox box = context.findRenderObject();
              Offset position = box.localToGlobal(details.localPosition);
              data.onAccepted = (data) {
                setState(() {
                  _currentPosition = data - widget.position;
                });
              };
              data.onMove = (details) {
                setState(() {
                  _currentPosition = details.delta;
                });
              };
              data.onCancel = () {
                setState(() {
                  _currentPosition = Offset.zero;
                });
              };
              data.onEnd = (details) => _handleDragEnd(details);
              DragAndDropLayer.of(context).startDrag(data, position);
            },
            child: Container(
              width: 50,
              height: 50,
              color: Colors.blue.withOpacity(0.5),
              child: Center(child: Text('Item')),
            ),
          );
        },
        onAccept: (Offset data) {},
        onWillAccept: (Offset data) => true,
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个 DragAndDropDemo 小部件,它包含一个用于放置项目的灰色区域和五个可拖拽的项目。
  2. 每个可拖拽的项目都是一个 DraggableItem 小部件。
  3. DraggableItem 小部件使用 GestureDetectorDragTarget 来处理拖拽事件。
  4. 当用户开始拖动项目时,DragAndDropLayer.of(context).startDrag 方法被调用,开始拖动操作。
  5. 在拖动结束时,我们更新项目的位置,并通过调用 onDragEnded 回调来存储新位置。

请注意,此代码示例是一个简单的实现,可能需要根据实际需求进行调整和扩展。

回到顶部