我尝试使用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
对我来说,它看起来像是指数和头寸的混合体。
也许有人知道我的错误?
谢谢! 迈克尔
答案 0 :(得分:1)
它是新旧索引,但是有问题。如您所见here。
以下是显示如何使用它们的示例:
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);
});
},
您可以看到一个演示here in this snippet。
根据我的经验(2019年1月),我放弃了Flutter的ReorderableListView并开始使用knopp/flutter_reorderable_list。我什至制作了Widget to make that switch easier,将其签出,看看是否对您有意义。
答案 1 :(得分:1)
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);}();
});
}
答案 2 :(得分:0)
根据有关ReorderCallback的文档,oldIndex
和newIndex
被传递给回调。
甚至提供了一个示例,说明如何使用回调实际订购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);
}