Flutter ReorderableListView组件 使用详解

37 min read

ReorderableListView是Flutter中非常有用的组件,它允许我们创建一个可以拖动和重新排序的列表。在本文中,我们将详细介绍如何使用ReorderableListView组件。

安装Flutter Reorderables库

在开始之前,我们需要先安装一个名为flutter_reorderables的库。可以通过以下方式在终端中安装库:

flutter pub add flutter_reorderable_listview

或者在pubspec.yaml文件中添加以下依赖项:

dependencies:
flutter_reorderable_listview: ^2.0.0

导入依赖后,我们就可以正式开始使用ReorderableListView组件。

创建ReorderableListView

ReorderableListView组件包含一个子类ReorderableList,我们需要使用它来创建一个ReorderableListView。ReorderableList可以使用ListView的大多数构造函数参数。如果需要设置itemCount,可以使用构造函数参数length。

下面是一个简单的例子,其中有5个可拖动的项目:

ReorderableListView(
   onReorder: _onReorder, //用于操作并更改列表项的回调方法
   children: [
      ListTile(key: ValueKey(1), title: Text('Item 1'),),
      ListTile(key: ValueKey(2), title: Text('Item 2'),),
      ListTile(key: ValueKey(3), title: Text('Item 3'),),
      ListTile(key: ValueKey(4), title: Text('Item 4'),),
      ListTile(key: ValueKey(5), title: Text('Item 5'),),
   ],
)

在这个例子中,我们将每个列表项都包装在ListTile中,以使其看起来更像一个“真正的”列表。请注意,我们在每个ListTile中使用了一个唯一的ValueKey。

回调方法_onReorder

在上面的代码中,我们也看到了一个名为_onReorder的回调方法。此方法用于操作并更改列表项的顺序,当用户重新排序列表项时,它将被调用。下面是一个简单的例子,它可以展示我们如何更改项目的顺序:

void _onReorder(int oldIndex, int newIndex) {
   setState(() {
      if (oldIndex < newIndex) {
         newIndex -= 1;
      }
      var item = _list.removeAt(oldIndex);
      _list.insert(newIndex, item);
   });
}

在这种情况下,我们只是提取旧索引处的项目,然后将其插入新索引处。我们还需要检查新索引是否在旧索引前面,如果是的话,我们就需要将新索引减一。最后,我们需要在setState()回调中调用该方法,以便更改被应用于列表中。

拖动手柄和整个列表项

ReorderableListView还有一个非常实用的功能:我们可以为列表项添加一个拖动手柄。这样,用户将只能通过拖动手柄来重新排列列表项,而不是整个列表项。

要为列表项添加拖动手柄,请将其包装在ReorderableDelayedDragStartListener Widget中。其中onDragStart参数用于指定拖动开始的回调,一般来说,你可以简单地使用emptyDragStartCallback,以确保sortables列表项可以被拖动。例如:

ReorderableListView(
   onReorder: _onReorder,
   children: [
      ReorderableDelayedDragStartListener(
         key: ValueKey(1),
         index: 0,
         child: ListTile(key: ValueKey(1), title: Text('Item 1'),),
         feedback: ListTile(key: ValueKey(1), title: Text('Item 1 (Dragging)'),),
         onDragStart: () => {},
      ),
      ReorderableDelayedDragStartListener(
         key: ValueKey(2),
         index: 1,
         child: ListTile(key: ValueKey(2), title: Text('Item 2'),),
         feedback: ListTile(key: ValueKey(2), title: Text('Item 2 (Dragging)'),),
         onDragStart: () => {},
      ),
   ],
)

现在我们的列表项有了可拖动的手柄!然而,我们仍然可以通过直接拖动列表项本身来重新排序。为了获取这个效果,我们只需要调用ReorderableList的ReorderableListener:

ReorderableListView(
   onReorder: _onReorder,
   children: [
      ReorderableDelayedDragStartListener(
         // ...
      ),
      ReorderableListener(
         child: ListTile(key: ValueKey(2), title: Text('Item 2'),),
      ),
   ],
)

现在,我们可以在任何地方拖动列表项来重新排列它们!

总结

在本文中,我们学习了如何使用flutter_reorderable_listview库来创建一个可排序的列表。我们可以使用ReorderableListView组件轻松创建可拖动和重排列的列表,并在每个列表项上添加可拖动的手柄。此外,我们还学习了如何在重新排序时更改项目的顺序。

使用ReorderableListView组件可以让我们非常方便地实现拖放排序的功能,具有很广泛的应用场景,例如ToDo列表、任务排列、页面排列等等。希望这篇文章能对你有所帮助!