Flutter ReorderableListView不起作用,它不持久列出子项

时间:2019-05-21 12:43:21

标签: dart flutter

我正在使用ReorderableListView,它可以处理运动,但是一旦离开触摸,它就会恢复为提供的原始数据。这是预期的输出。谁能展示如何实现这一目标?

enter image description here

3 个答案:

答案 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 的第一个实例而不是正确的实例。