[Flutter]

[Flutter] ReorderableListView (ListView drag / drag ListView)

Hevton 2022. 10. 31. 16:01
반응형

 

일반적인 ListView는 Drag and Drop이 안된다.

 

Drag and Drop을 지원하는, Flutter 내장 뷰 ReorderableListView가 있다.

 

기존 ListView를 ReorderableListView로 옮기는 상황을 예로 보여드리고자 합니다.

class _MyWidgetState extends State<MyWidget> {
  
  
  List<String> items = ["one", "two", "three", "four", "five"];
  
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: items.length,
      itemBuilder: (context, index) {
        
        return ListTile(title: Text('${items[index]}'));
        
      }
    );
  }
}

 

 


추가된 것은 두가지다.

onReorder : 인자 구현과

ListTile 내의 key: 인자 구현이다.

class _MyWidgetState extends State<MyWidget> {
  
  
  List<String> items = ["one", "two", "three", "four", "five"];
  
  @override
  Widget build(BuildContext context) {
    return ReorderableListView.builder(
      onReorder: (int oldIndex, int newIndex) {
        setState(() {
          if (oldIndex < newIndex) {
            newIndex -= 1;         
          }
          final item = items.removeAt(oldIndex);
          items.insert(newIndex, item);
        });
      },
      itemCount: items.length,
      itemBuilder: (context, index) {
        
        return ListTile(title: Text('${items[index]}'), key: Key('$index'));
        
      }
    );
  }
}

 

 

이대로 구현해서 만족하지 않는 사람들이 계실 것이 분명하다.

이 상태에선, LongClick을 통한 Drag Drop만이 움직임을 제어할 수 있다.

 

 

trailing 아이콘 같은 것을 통해서, 클릭만으로도 움직이게 하는 방법이 있다.

 

나머진 다 동일한데, trailing만 추가되었다.

class _MyWidgetState extends State<MyWidget> {
  
  
  List<String> items = ["one", "two", "three", "four", "five"];
  
  @override
  Widget build(BuildContext context) {
    return ReorderableListView.builder(
      onReorder: (int oldIndex, int newIndex) {
        setState(() {
          if (oldIndex < newIndex) {
            newIndex -= 1;         
          }
          final item = items.removeAt(oldIndex);
          items.insert(newIndex, item);
        });
      },
      itemCount: items.length,
      itemBuilder: (context, index) {
        
        return ListTile(title: Text('${items[index]}'), key: Key('$index'), trailing: ReorderableDragStartListener(
                        index: index, child: Icon(Icons.drag_handle)),);
        
      }
    );
  }
}
반응형