update method

void update(
  1. LinkedList<VNodeEntry> oldList,
  2. LinkedList<VNodeEntry> newList
)

Implementation

void update(LinkedList<VNodeEntry> oldList, LinkedList<VNodeEntry> newList) {
  if (oldList.isEmpty && newList.isEmpty) {
    return;
  }

  var oldListWithKeys = false;
  var oldEntry = oldList.isEmpty ? null : oldList.first;
  while (oldEntry != null) {
    final vNode = oldEntry.vNode;
    if (vNode.key != null) {
      oldListWithKeys = true;
      break;
    }

    oldEntry = oldEntry.next;
  }

  if (oldListWithKeys) {
    var newWithKeys = false;
    var newEntry = newList.isEmpty ? null : newList.first;
    while (newEntry != null) {
      final vNode = newEntry.vNode;
      if (vNode.key != null) {
        newWithKeys = true;
        break;
      }

      newEntry = newEntry.next;
    }

    if (newWithKeys) {
      final diff = Diff();
      final patches =
          diff.diff(oldList, newList, getKey: _getKey, isEqual: _isEqual);
      _removed = {};
      _patch(patches, oldList);
      if (_removed.isNotEmpty) {
        for (final element in _removed) {
          element.dispose();
        }

        _removed = const {};
      }

      return;
    }
  }

  _updateWithoutKeys(oldList, newList);
}