Аргументы onReorder () в Flutter ReorderableListView - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь создать переупорядочиваемый список во Flutter с помощью виджета ReorderableListView:

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

Для меня это выглядит как сочетание индекса и позиции ..

Может, у кого-то есть идея, в чем моя ошибка?

Спасибо и всего наилучшего, Michael

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Это старый и новый индекс, но есть проблемы. Для этого есть открытые проблемы, как вы можете видеть здесь .

Вот пример, который показывает, как их использовать:

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 г. / январь), я отказался от ReorderableListView Flutter и начал использовать knopp / flutter_reorderable_list . Я даже сделал Виджет, чтобы сделать этот переход проще , проверьте его и посмотрите, имеет ли он смысл для вас.

0 голосов
/ 13 января 2019

Согласно документации, касающейся 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);
}
...