Flutter 此小部件的所有子部件必须在可重新排序的Listview中有一个键
我想重新排列我的列表,但我得到了这个错误。 此小部件的所有子部件必须在可重新排序的Listview中有一个键Flutter 此小部件的所有子部件必须在可重新排序的Listview中有一个键,flutter,flutter-layout,Flutter,Flutter Layout,我想重新排列我的列表,但我得到了这个错误。 此小部件的所有子部件必须在可重新排序的Listview中有一个键 Widget list(list) { return Scrollbar( child: ReorderableListView( header: null, onReorder: _onReorder, padding: const EdgeInsets.symmetric(vertical: 8.0),
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);
},
)
]),
);
}
小部件列表(列表){
返回滚动条(
子:ReorderableListView(
标题:null,
onReorder:_onReorder,
填充:常量边集。对称(垂直:8.0),
儿童:[
ListView.builder(
itemCount:list.length,
收缩膜:对,
itemBuilder:(上下文,索引){
返回_singleToDoWidget(列表[索引],索引);
},
)
]),
);
}
键用于唯一标识列表中的每个项目,因为您将移动它们。您可以这样做:
ReoderableListView(
header: null,
onReorder: _onReorder,
children: [
for(var i; i < list.length; i++) {
Container(
key: ValueKey(list[index]),
child: _singleToDoWidget(list[index], index),
}
],
);
只是想说明一下您的实现,以及
键的位置,这就是我如何获得重新排列动态列表的解决方案
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),
);
}
void\u onReorder(int-oldIndex,int-newIndex){
设置状态(){
如果(新建索引>旧索引){
newIndex-=1;
}
最终动态x=列表[旧索引];
列表.删除(旧索引);
列表。插入(新索引,x);
});
}
最终列表子项=映射(列表,(索引,i){
返回_singleToDoWidget(列表[索引],索引);
});
返回滚动条(
子:ReorderableListView(
标题:null,onReorder:_onReorder,子项:child),
);
小部件_singleToDoWidget(动态列表项,索引){
返回列表块(
键:ValueKey(索引),
标题:文本(listItem.title),
);
}
首先,为什么在listview中有一个listview?@RémiRousselet不知道我以这种方式实现的可重排序列表视图的确切想法,我遇到了这个关键错误。我浏览了一些示例,但它们使用的是静态列表,在我的应用程序中,我的列表数据来自一个api调用。我不知道如何处理这种类型的动态数据。
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),
);
}