removeValueListener method

  1. @override
void removeValueListener(
  1. ValueCallback<T> listener
)
override

Implementation

@override
void removeValueListener(ValueCallback<T> listener) {
  _initializeMixinVariables();
  assert(null != _valueListeners && null != _valueListenersCount);

  // Copied from [ChangeNotifer].
  void _removeAt(int index) {
    // The list holding the listeners is not growable for performances
    // reasons. We still want to shrink this list if a lot of listeners
    // have been added and then removed outside a notifyListeners iteration.
    // We do this only when the real number of listeners is half the length
    // of our list.
    _valueListenersCount = _valueListenersCount! - 1;

    if (_valueListenersCount! * 2 <= _valueListeners!.length) {
      final newListeners =
          List<ValueCallback<T>?>.filled(_valueListenersCount!, null);

      // Listeners before the index are at the same place.
      for (var i = 0; i < index; i++) newListeners[i] = _valueListeners![i];

      // Listeners after the index move towards the start of the list.
      for (var i = index; i < _valueListenersCount!; i++)
        newListeners[i] = _valueListeners![i + 1];

      _valueListeners = newListeners;
    } else {
      // When there are more listeners than half the length of the list, we
      // only shift our listeners, so that we avoid to reallocate memory for
      // the whole list.
      for (var i = index; i < _valueListenersCount!; i++)
        _valueListeners![i] = _valueListeners![i + 1];

      _valueListeners![_valueListenersCount!] = null;
    }
  }

  for (var i = 0; i < _valueListenersCount!; i++) {
    final _listener = _valueListeners![i];

    if (_listener == listener) {
      _removeAt(i);
      break;
    }
  }
}