Flutter 此小部件的所有子部件必须在可重新排序的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),

我想重新排列我的列表,但我得到了这个错误。 此小部件的所有子部件必须在可重新排序的Listview中有一个键

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),
   );
 }