通过拖放对Flutter中的SliverList中的项目重新排序

时间:2018-12-30 18:43:10

标签: flutter flutter-sliver

我正在将 SliverList SliverChildBuilderDelegate 一起使用,以即时生成列表项。现在,我试图允许用户通过在行中每个项目的手柄图标上拖放来对列表项目进行重新排序。

我尝试了不同的操作(例如Draggable Widget),但是到目前为止,我还没有找到解决方案。有没有人已经通过SliverList小部件使用拖放重新排序,并且可以给我提示?

无法使用ReorderableListView窗口小部件,导致将ListView混入SliverList。我想使用SliverAppBar允许滚动淡出效果,如您在此处看到的:https://medium.com/flutter-io/slivers-demystified-6ff68ab0296f

以下是我的SliverList的结构:

return Scaffold(
  body: RefreshIndicator(
    ...
    child: CustomScrollView(
      ...
      slivers: <Widget>[
        SliverAppBar(...),
        SliverList(
          delegate: SliverChildBuilderDelegate(...),
        )
        ...

在此先谢谢您, 迈克尔

2 个答案:

答案 0 :(得分:0)

您可以签出flutter_reorderable_list。我还没有尝试过它,目前正在自己​​滚动它,但是看起来不错,the example使用带有SliverList的CustomScrollView。

答案 1 :(得分:0)

在pub上查看此reorderables软件包。它最近为SliverList添加了支持。

此处的屏幕截图:ReorderableSliverList

该示例具有条状列表和应用程序栏,并显示您要查找的内容。只需将代码中的SliverList和SliverChildBuilderDelegate替换为包中的计数器部分即可。

class _SliverExampleState extends State<SliverExample> {
  List<Widget> _rows;

  @override
  void initState() {
    super.initState();
    _rows = List<Widget>.generate(50,
        (int index) => Text('This is sliver child $index', textScaleFactor: 2)
    );
  }

  @override
  Widget build(BuildContext context) {
    void _onReorder(int oldIndex, int newIndex) {
      setState(() {
        Widget row = _rows.removeAt(oldIndex);
        _rows.insert(newIndex, row);
      });
    }
    ScrollController _scrollController = PrimaryScrollController.of(context) ?? ScrollController();

    return CustomScrollView(
      // a ScrollController must be included in CustomScrollView, otherwise
      // ReorderableSliverList wouldn't work
      controller: _scrollController,
      slivers: <Widget>[
        SliverAppBar(
          expandedHeight: 210.0,
          flexibleSpace: FlexibleSpaceBar(
            title: Text('ReorderableSliverList'),
            background: Image.network(
              'https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Yushan'
                '_main_east_peak%2BHuang_Chung_Yu%E9%BB%83%E4%B8%AD%E4%BD%91%2B'
                '9030.png/640px-Yushan_main_east_peak%2BHuang_Chung_Yu%E9%BB%83'
                '%E4%B8%AD%E4%BD%91%2B9030.png'),
          ),
        ),
        ReorderableSliverList(
          delegate: ReorderableSliverChildListDelegate(_rows),
          // or use ReorderableSliverChildBuilderDelegate if needed
//          delegate: ReorderableSliverChildBuilderDelegate(
//            (BuildContext context, int index) => _rows[index],
//            childCount: _rows.length
//          ),
          onReorder: _onReorder,
        )
      ],
    );
  }
}