rearrange method
- Iterable<
OverlayEntry> newEntries, { - OverlayEntry? below,
- OverlayEntry? above,
Remove all the entries listed in the given iterable, then reinsert them into the overlay in the given order.
Entries mention in newEntries
but absent from the overlay are inserted
as if with insertAll.
Entries not mentioned in newEntries
but present in the overlay are
positioned as a group in the resulting list relative to the entries that
were moved, as specified by one of below
or above
, which, if
specified, must be one of the entries in newEntries
:
If below
is non-null, the group is positioned just below below
.
If above
is non-null, the group is positioned just above above
.
Otherwise, the group is left on top, with all the rearranged entries
below.
It is an error to specify both above
and below
.
Implementation
void rearrange(Iterable<OverlayEntry> newEntries, { OverlayEntry? below, OverlayEntry? above }) {
final List<OverlayEntry> newEntriesList = newEntries is List<OverlayEntry> ? newEntries : newEntries.toList(growable: false);
assert(_debugVerifyInsertPosition(above, below, newEntries: newEntriesList));
assert(
newEntriesList.every((OverlayEntry entry) => entry._overlay == null || entry._overlay == this),
'One or more of the specified entries are already present in another Overlay.',
);
assert(
newEntriesList.every((OverlayEntry entry) => _entries.indexOf(entry) == _entries.lastIndexOf(entry)),
'One or more of the specified entries are specified multiple times.',
);
if (newEntriesList.isEmpty) {
return;
}
if (listEquals(_entries, newEntriesList)) {
return;
}
final LinkedHashSet<OverlayEntry> old = LinkedHashSet<OverlayEntry>.of(_entries);
for (final OverlayEntry entry in newEntriesList) {
entry._overlay ??= this;
}
setState(() {
_entries.clear();
_entries.addAll(newEntriesList);
old.removeAll(newEntriesList);
_entries.insertAll(_insertionIndex(below, above), old);
});
}