我想重新排序列表,但出现此错误。 此小部件的所有子级都必须在“可重新排序的列表视图”中具有一个键
Widget list(list) {
return Scrollbar(
child: ReorderableListView(
header: null,
onReorder: _onReorder,
padding: const EdgeInsets.symmetric(vertical: 8.0),
children: <Widget>[
ListView.builder(
itemCount: list.length,
shrinkWrap: true,
itemBuilder: (contex, index) {
return _singleToDoWidget(list[index], index);
},
)
]),
);
}
答案 0 :(得分:0)
key
用于唯一标识列表中的每个项目,因为您将在其中移动它们。
您可以执行以下操作:
ReoderableListView(
header: null,
onReorder: _onReorder,
children: [
for(var i; i < list.length; i++) {
Container(
key: ValueKey(list[index]),
child: _singleToDoWidget(list[index], index),
}
],
);
或者您可以在小部件函数本身中指定key
。
Widget _singleToDoWidget(String title, int index) {
return YourRootWidget(
key: ValueKey(title),
...
),
}
只是试图说明您的实现以及 key
的去向
答案 1 :(得分:0)
这就是我获得解决方案以重新排列动态列表的方式。
void _onReorder(int oldIndex, int newIndex) {
setState(() {
if (newIndex > oldIndex) {
newIndex -= 1;
}
final dynamic x = list[oldIndex];
list.removeAt(oldIndex);
list.insert(newIndex, x);
});
}
final List child = map<Widget>(list, (index, i) {
return _singleToDoWidget(list[index], index);
});
return Scrollbar(
child: ReorderableListView(
header: null, onReorder: _onReorder, children: child),
);
Widget _singleToDoWidget(dynamic listItem, index) {
return ListTile(
key: ValueKey(index),
title: Text(listItem.title),
);
}