Repository: flutter
Issue: State of SliverReorderableList items is lost in multiple usage scenarios making it very difficult to use
Labels: framework,has reproducible steps,P2,team-framework,triaged-framework,found in release: 3.16,found in release: 3.18

### Steps to reproduce

1. Run the provided code example
2. Try to reorder items
3. Notice that neither `_ReorderableItemState` nor `_ItemState` is disposed on reorder
4. Now change the `ReorderableDelayedDragStartListener.key` or `Item.key` to other types and values

### Expected results

1. Using the `SliverReorderableList` should not require assigning GlobalKeys to items. Setting `ReorderableDelayedDragStartListener.key = ValueKey(itemKey)` should be enough to make it work properly.
But it's not enough now because internally `_ReorderableItemState` uses a global key that compares indexes as well.
It should work if we can refactor it to not consider index during comparison. Below is the method from `_ReorderableItemGlobalKey`
```
@override
  bool operator ==(Object other) {
    if (other.runtimeType != runtimeType) {
      return false;
    }
    return other is _ReorderableItemGlobalKey
        && other.subKey == subKey
        && other.index == index
        && other.state == state;
  }
```
2. Documentation should clearly mention how to correctly use `SliverReorderableList` in regards to keys.

### Actual results

State of either `_ReorderableItemState` or `_ItemState` or both is disposed on reorder depending on the combination of keys

### Code sample

<details open><summary>Code sample</summary>

```dart
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

final items = [
  "first",
  "second",
  "third",
];

void main() {
  MemoryAllocations.instance.addListener((event) {
    if (event is! ObjectDisposed) return;
    final object = event.object;
    if (object is! State) return;
    debugPrint("disposed $object");
  });
  runApp(
    MaterialApp(
      home: Scaffold(
        body: CustomScrollView(
          slivers: [
            const SliverAppBar(),
            SliverReorderableList(
              itemBuilder: (BuildContext context, int index) {
                final itemKey = items[index];
                return ReorderableDelayedDragStartListener(
                  //FIXME: if one uses any other key here (for example ValueKey(itemKey)) - _ReorderableItemState will get disposed on reorder
                  //key: ValueKey(itemKey),
                  key: ValueKey(index),
                  index: index,
                  child: Item(
                    //FIXME: if one does not use a GlobalKey bound to the item identity (for example null) - _ItemState will get disposed on reorder
                    //key: null,
                    key: GlobalObjectKey(itemKey),
                  ),
                );
              },
              itemCount: items.length,
              onReorder: (int oldIndex, int newIndex) {
                if (oldIndex < newIndex) {
                  newIndex -= 1;
                }
                final item = items.removeAt(oldIndex);
                items.insert(newIndex, item);
              },
            ),
          ],
        ),
      ),
    ),
  );
}

class Item extends StatefulWidget {
  const Item({super.key});

  @override
  _ItemState createState() {
    debugPrint("creating state");
    return _ItemState();
  }
}

class _ItemState extends State<Item> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.key.toString());
  }
}

```

</details>



### Flutter Doctor output

<details open><summary>Doctor output</summary>

```console
[✓] Flutter (Channel stable, 3.16.3, on Manjaro Linux 6.6.3-1-MANJARO, locale en_US.UTF-8)
    • Flutter version 3.16.3 on channel stable at /opt/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision b0366e0a3f (10 days ago), 2023-12-05 19:46:39 -0800
    • Engine revision 54a7145303
    • Dart version 3.2.3
    • DevTools version 2.28.4
```

</details>