ReorderableListView in Flutter

Mattepuffo's logo
ReorderableListView in Flutter

ReorderableListView in Flutter

In questo articolo vediamo come usare il widget ReorderableListView, che in sostanza è una ListView che può essere ordinata con il drag-and-drop.

Non ci sono widget esterni da installare, e sostanzialmente l'uso è molto simile a quello di una ListView "classica".

Solo che metteremo una icona che ci permette di trascinare le varie righe.

Ecco il codice di esempio:

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<int> _list = List.generate(50, (int index) => index);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: ReorderableListView(
        children: <Widget>[
          for (final items in _list)
            Card(
              key: ValueKey(_list[items]),
              color: (_list[items].isEven)
                  ? Colors.deepOrangeAccent
                  : Colors.amber,
              elevation: 2,
              child: ListTile(
                title: Text('Elemento ${_list[items]}'),
                leading: const Icon(Icons.code),
              ),
            ),
        ],
        onReorder: (oldIndex, newIndex) {
          setState(() {
            if (newIndex > oldIndex) {
              newIndex -= 1;
            }
            final items = _list.removeAt(oldIndex);
            _list.insert(newIndex, items);
          });
        },
      ),
    );
  }
}

Enjoy!


Condividi

Commentami!