Last active
June 17, 2022 12:26
-
-
Save Albert221/db5ee629bfe628e458b79857cc5d7b07 to your computer and use it in GitHub Desktop.
ProxyValueListenable<T> for Flutter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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