可拖拽的流式布局

说明

本次实现的可拖拽的瀑布流布局,使用的是flutter_staggered_grid_view库,其他流式布局可详细这个库可以让gridview的item自由排列等等。

拖拽功能是使用的官方组件Draggable和DragTarget,详细代码可以看demo。
本文完整示例demo

瀑布流布局介绍

Widget waterFall() {
    double spacing = 6;
    ///自由排布的gridview
    return MasonryGridView.count(
      crossAxisCount: 2,
      itemCount: urlList.length,
        ///listWidget()返回的是一个拥有每个item的list。
      itemBuilder: (BuildContext context, int index) => listWidget()[index],
      mainAxisSpacing: spacing,
      crossAxisSpacing: spacing,
    );
  }


///单个item
Container(
    ///瀑布流布局核心代码
    height: index.isEven ? 200 : 250,
    child: Image.network(
        urlList[index],
        fit: BoxFit.cover,
    ),
);

拖拽Draggable介绍

除了里面的feedback还有很多回调方法。

///把单个item包裹上LongPressDraggable
Widget itemWidget(int index) {
    return LongPressDraggable(
        data: index,
        ///组件拖拽的回调
        child: DragTarget<int>(
          onAccept: (data) {
            setState(() {
                ///tem保存当前列表项,删除当前列表项,插入保存的列表项tem
              final tem = urlList[data];
              urlList.remove(tem);
              urlList.insert(index, tem);
            });
          },
          builder: (context, candidateData, rejectedData) {
              ///item代码
            return Container(
              ///瀑布流布局核心代码
              height: index.isEven ? 200 : 250,
              child: Image.network(
                urlList[index],
                fit: BoxFit.cover,
              ),
            );
          },
        ),

        ///拖拽时候显示的组件
        feedback: Container(
          width: (MediaQuery.of(context).size.width - 10) / 2,
          height: index.isEven ? 200 : 250,
          child: Image.network(
            urlList[index],
            fit: BoxFit.cover,
          ),
        ));
  }