10

我尝试使用 ReorderableListView 小部件在 Flutter 中创建一个可重新排序的列表

return ReorderableListView(
    onReorder: (int index, int targetPosition) {
        print(index.toString() + " -> " + targetPosition.toString());
    }
...

我找不到关于 onReorder 中的两个参数的确切解释。我找到了一些“oldIndex”、“newIndex”员工——但这看起来并不正确。

我已经建立了一个包含三个项目的列表的示例。当我拖动项目时,我得到以下(让我感到困惑)结果:

Position 1 -> Position 2 results in 0 -> 2
Position 1 -> Position 3 results in 0 -> 3
Position 3 -> Position 1 results in 2 -> 1

对我来说,它看起来像是索引和位置的混合......

也许有人知道我的错误是什么?

4

3 回答 3

13

根据有关ReorderCallback的文档,oldIndexandnewIndex被传递给回调。甚至还有一个关于如何使用回调来实际订购 a 中的项目的示例List

final List<MyDataObject> backingList = <MyDataObject>[/* ... */];

void handleReorder(int oldIndex, int newIndex) {
  if (oldIndex < newIndex) {
    // removing the item at oldIndex will shorten the list by 1.
    newIndex -= 1;
  }
  final MyDataObject element = backingList.removeAt(oldIndex);
  backingList.insert(newIndex, element);
}
于 2019-01-12T21:54:21.737 回答
8

它是旧索引和新索引,但它有问题。正如您在此处看到的那样,有一些未解决的问题。

这是一个显示如何使用它们的示例:

onReorder: (oldIndex, newIndex) {
  setState(() {
    // These two lines are workarounds for ReorderableListView problems
    if (newIndex > _sampleItems.length) newIndex = _sampleItems.length;
    if (oldIndex < newIndex) newIndex--;

    MyItem item = _sampleItems[oldIndex];
    _sampleItems.remove(item);
    _sampleItems.insert(newIndex, item);
  });
},

您可以在此片段中查看演示。

根据我的经验(2019/1 月),我放弃了 Flutter 的 ReorderableListView 并开始使用knopp/flutter_reorderable_list。我什至制作了一个小部件来使切换更容易,检查一下,看看它是否对你有意义。

于 2019-01-12T22:11:12.767 回答
0

onReorder 函数在大多数教程中都写错了。我认为我刚刚写的这个是有效的。

void _onReorder(int oldIndex, int newIndex) {
    setState(() {
      newIndex > oldIndex ? (){newIndex--; int row = V755.removeAt(oldIndex);
      V755.insert(newIndex, row);}() : (){int row = V755.removeAt(oldIndex);V755.insert(newIndex, row);}();
    });
}
于 2021-02-23T08:24:07.393 回答