如何将项目拖放到扩展图块内并拖放到扩展图块外部?

问题描述 投票:0回答:1

enter image description here

如何处理将列表拖放到另一个列表中?

我怎样才能实现这个目标?

感谢您的帮助!

我尝试过使用

drag_and_drop_lists
包装,但我被卡在物品内部和外部的手柄中。

完整示例:

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

Future<void> main() async {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ExpansionTileExample(),
    );
  }
}

class FolderData {
  String name;
  List<ListData> listData;
  FolderData({this.name, this.listData});
}

class ListData {
  String name;

  ListData({this.name});
}

class ExpansionTileExample extends StatefulWidget {
  ExpansionTileExample({Key key}) : super(key: key);

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

class _ListTileExample extends State<ExpansionTileExample> {
  List<dynamic> _lists = [];

  @override
  void initState() {
    super.initState();

    _lists.add(FolderData(name: "Folder1", listData: []));


   _lists.add(FolderData(name: "Folder2", listData: []));

    _lists.add(ListData(
      name: "List1",
    ));


    _lists.add(ListData(
      name: "List2",
    ));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Expansion Tiles with drag and drop'),
      ),
      body: DragAndDropLists(
        children: List.generate(_lists.length, (index) => _buildList(index)),
        onItemReorder: _onItemReorder,
        onListReorder: _onListReorder,
        listGhost: Padding(
          padding: const EdgeInsets.symmetric(vertical: 30.0),
          child: Center(
            child: Container(
              padding: EdgeInsets.symmetric(vertical: 30.0, horizontal: 100.0),
              decoration: BoxDecoration(
                border: Border.all(),
                borderRadius: BorderRadius.circular(7.0),
              ),
              child: Icon(Icons.add_box),
            ),
          ),
        ),
      ),
    );
  }

  _buildList(int outerIndex) {
    var innerList = _lists[outerIndex];
    return (innerList is FolderData)
        ? DragAndDropListExpansion(
            title: Text('List ${innerList.name}'),
            subtitle: Text('Subtitle ${innerList.name}'),
            leading: Icon(Icons.ac_unit),
            children: List.generate(innerList.listData.length, (index) => _buildItem(innerList.listData[index].name)),
            listKey: ObjectKey(innerList),
          )
        : DragAndDropList(
            children: <DragAndDropItem>[
              DragAndDropItem(
                child: ListTile(title: Text(innerList.name)),
              ),
            ],
          );
  }

  _buildItem(String item) {
    return DragAndDropItem(
      child: ListTile(
        title: Text(item),
      ),
    );
  }

// ======== Stuck here ========

  _onItemReorder(int oldItemIndex, int oldListIndex, int newItemIndex, int newListIndex) {
    setState(() {
      var movedDataOuter = _lists[oldListIndex];

      if (movedDataOuter is ListData) {
        //  1. drag  list inside folder.
        var movedItem = _lists.removeAt(oldListIndex);
        _lists[newListIndex].listData.insert(newItemIndex, movedItem);
      } else {
        // 2. remove list from folder.
        var movedItem = _lists[oldListIndex].listData.removeAt(oldItemIndex);
        _lists.insert(newListIndex, movedItem);

        // 3. drag & drop inner list inside folder
        //  var movedItem = _lists[oldListIndex].listData.removeAt(oldItemIndex);
        // _lists[oldListIndex].listData.insert(newItemIndex, movedItem);
      }

      // 4. drag and drop list outsie folder
      // var movedItem = _lists.removeAt(oldListIndex);
      // _lists.insert(newListIndex, movedItem);
    });
  }

  _onListReorder(int oldListIndex, int newListIndex) {
    setState(() {
      var movedList = _lists.removeAt(oldListIndex);
      if (movedList is FolderData) {
        _lists.insert(newListIndex, movedList);
      } else {
        _lists[newListIndex].listData.insert(newListIndex, movedList);
      }
    });
  }
}
flutter dart drag-and-drop
1个回答
2
投票

您可以在 pub.dev 上使用以下软件包:

drag_and_drop_lists

包装:链接

如果您需要教程,请链接

© www.soinside.com 2019 - 2024. All rights reserved.