removeValueListener method
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;
}
}
}