insertItem method

void insertItem(
  1. int index, {
  2. Duration duration = _kDuration,
})

Insert an item at index and start an animation that will be passed to SliverAnimatedList.itemBuilder when the item is visible.

This method's semantics are the same as Dart's List.insert method: it increases the length of the list by one and shifts all items at or after index towards the end of the list.

Implementation

void insertItem(int index, {Duration duration = _kDuration}) {
  assert(index != null && index >= 0);
  assert(duration != null);

  final int itemIndex = _indexToItemIndex(index);
  assert(itemIndex >= 0 && itemIndex <= _itemsCount);

  // Increment the incoming and outgoing item indices to account
  // for the insertion.
  for (final _ActiveItem item in _incomingItems) {
    if (item.itemIndex >= itemIndex) item.itemIndex += 1;
  }
  for (final _ActiveItem item in _outgoingItems) {
    if (item.itemIndex >= itemIndex) item.itemIndex += 1;
  }

  final AnimationController controller = AnimationController(
    duration: duration,
    vsync: this,
  );
  final _ActiveItem incomingItem = _ActiveItem.incoming(
    controller,
    itemIndex,
  );
  setState(() {
    _incomingItems
      ..add(incomingItem)
      ..sort();
    _itemsCount += 1;
  });

  controller.forward().then<void>((_) {
    _removeActiveItemAt(_incomingItems, incomingItem.itemIndex)!
        .controller!
        .dispose();
  });
}