Как сделать чтобы в виджете Flutter ReorderableListView перетаскивались, сразу несколько элементов?

Список элементов "ReorderableListView " их можно перетаскивать местами по одном, также я добавил возможность выделения каждого, как сделать так чтобы перетаскивались вместе с тем за который тянут и выделенные элементы?

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: MyApp(),
      ),
    ),
  );
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class ResJson {
  final int id;
  final String name;
  ResJson(this.id, this.name);
}

class _MyAppState extends State<MyApp> {
  // List<String> _list = ["Apple", "Ball", "Cat", "Dog", "Elephant"];
  List<ResJson> _list = [
    ResJson(1, "Apple"),
    ResJson(2, "Ball"),
    ResJson(3, "Cat"),
    ResJson(4, "Dog"),
    ResJson(5, "Elephant"),
  ];
  Set<int> _listId = {};

  @override
  Widget build(BuildContext context) {
    return ReorderableListView(
      // создаем список виджетов на основе списка строк
      children: _list
          .map(
            (item) => ListTile(
              key: Key("${item.id}"),
              title: Text(item.name),
              onTap: () {
                if (_listId.contains(item.id)) {
                  _listId.remove(item.id);
                } else {
                  _listId.add(item.id);
                }
                print(_listId);
                // перерисовка состояния
                setState(() {});
              },
              tileColor: _listId.contains(item.id) ? Colors.grey : Colors.white,
            ),
          )
          .toList(),
      // редактируем список строк и запускаем перерисовку
      onReorder: (int start, int current) {
        // перетаскивание сверху вниз
        if (start < current) {
          int end = current - 1;
          ResJson startItem = _list[start];
          int i = 0;
          int local = start;
          do {
            _list[local] = _list[++local];
            i++;
          } while (i < end - start);
          _list[end] = startItem;
        }
        // перетаскивание снизу вверх
        else if (start > current) {
          ResJson startItem = _list[start];
          for (int i = start; i > current; i--) {
            _list[i] = _list[i - 1];
          }
          _list[current] = startItem;
        }
        // перерисовка состояния
        setState(() {});
      },
    );
  }
}
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы