此小部件的所有子级都必须在“可重新排序的列表视图”中具有键

时间:2019-09-05 12:09:13

标签: flutter flutter-layout

我想重新排序列表,但出现此错误。  此小部件的所有子级都必须在“可重新排序的列表视图”中具有一个键

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

2 个答案:

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