答案 0 :(得分:3)
另一个选择,而不是直接调整索引值:
yourList.insert(_newIndex, yourList.removeAt(_oldIndex));
答案 1 :(得分:0)
您可以使用此代码。
class _HomePageState extends State<HomePage> {
List<String> _list = List.generate(5, (i) => "${i}");
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: ReorderableListView(
padding: EdgeInsets.symmetric(horizontal: 40),
children: _list.map((String string) => ListTile(key: Key(_list[_list.indexOf(string)]), title: Text(string))).toList(),
onReorder: (oldIndex, newIndex) {
String old = _list[oldIndex];
if (oldIndex > newIndex) {
for (int i = oldIndex; i > newIndex; i--) {
_list[i] = _list[i - 1];
}
_list[newIndex] = old;
} else {
for (int i = oldIndex; i < newIndex - 1; i++) {
_list[i] = _list[i + 1];
}
_list[newIndex - 1] = old;
}
setState(() {});
},
),
);
}
}
答案 2 :(得分:0)
今天想自己做。对任何一个答案都不满意。这是我想出来的。
ReorderableListView(
padding: EdgeInsets.all(6),
buildDefaultDragHandles: false,
onReorder: (int oldIndex, int newIndex) {
test.insert(newIndex, test[oldIndex]);
if (oldIndex < newIndex) {
test.removeAt(oldIndex);
} else {
test.removeAt(oldIndex + 1);
}
setState(() {});
},
children: test.asMap().entries.map((e) {
return ReorderableDragStartListener(
index: e.key,
key: Key(e.key.toString() + e.value),
child: AspectRatio(
aspectRatio: 16 / 9,
child: Card(
child: Center(child: Text(e.value)),
elevation: 4,
),
),
);
}).toList(),
),
这避免了 user6274128 的答案中不必要的循环,并且没有 Scott 的答案中的错误。它还避免了索引基于 List.indexof 的错误,因为这将返回 String 的第一个实例而不是正确的实例。