Skip to content

Instantly share code, notes, and snippets.

@Albert221
Last active June 17, 2022 12:26
Show Gist options
  • Save Albert221/db5ee629bfe628e458b79857cc5d7b07 to your computer and use it in GitHub Desktop.
Save Albert221/db5ee629bfe628e458b79857cc5d7b07 to your computer and use it in GitHub Desktop.
ProxyValueListenable<T> for Flutter
import 'package:flutter/foundation.dart';
class ProxyValueListenable<T> implements ValueListenable<T> {
ProxyValueListenable(this._parent) {
_parent.addListener(_listener);
}
final _listeners = <VoidCallback>[];
ValueListenable<T> _parent;
ValueListenable<T> get parent => _parent;
set parent(ValueListenable<T> value) {
if (value == _parent) return;
_parent.removeListener(_listener);
final valueChanged = value.value != _parent.value;
_parent = value;
value.addListener(_listener);
if (valueChanged) _listener();
}
@override
T get value => parent.value;
void _listener() {
for (final listener in _listeners) {
listener();
}
}
@override
void addListener(VoidCallback listener) {
_listeners.add(listener);
}
@override
void removeListener(VoidCallback listener) {
_listeners.remove(listener);
}
void dispose() {
_parent.removeListener(_listener);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment