Created
September 6, 2023 11:04
-
-
Save MacDeveloper1/b1f629aebf9516c6850a62b153b0e267 to your computer and use it in GitHub Desktop.
DebouncedScrollController
This file contains 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
class DebouncedScrollController extends ScrollController { | |
DebouncedScrollController({ | |
super.initialScrollOffset, | |
super.keepScrollOffset, | |
super.debugLabel, | |
super.onAttach, | |
super.onDetach, | |
this.debounceTime = const Duration(milliseconds: 150), | |
}) { | |
_streamSubscription = _streamController.stream | |
.debounceTime(debounceTime) | |
.listen(((event) => _listeners.forEach((listener) => listener()))); | |
super.addListener(_onScroll); | |
} | |
/// The time for debouncing scroll events. | |
/// | |
/// Default value is `Duration(milliseconds: 150)`. | |
final Duration debounceTime; | |
final _streamController = StreamController<ScrollPosition>.broadcast(); | |
late final StreamSubscription<ScrollPosition> _streamSubscription; | |
List<VoidCallback> _listeners = <VoidCallback>[]; | |
@override | |
bool get hasListeners => _listeners.isNotEmpty; | |
@override | |
void addListener(VoidCallback listener) => _listeners.add(listener); | |
@override | |
void removeListener(VoidCallback listener) => _listeners.remove(listener); | |
void resumeNotification() => _streamSubscription.resume(); | |
void pauseNotification() => _streamSubscription.pause(); | |
void _onScroll() { | |
if (hasClients) { | |
_streamController.add(position); | |
} | |
} | |
@override | |
void dispose() { | |
_streamSubscription.cancel(); | |
_streamController.close(); | |
_listeners = []; | |
super.dispose(); | |
} | |
@override | |
String toString() { | |
final List<String> description = <String>[]; | |
debugFillDescription(description); | |
return '${describeIdentity(this)}(${description.join(", ")})'; | |
} | |
@override | |
void debugFillDescription(List<String> description) { | |
if (debounceTime.inMicroseconds > 0) { | |
description.add('debounceTime: $debounceTime'); | |
} | |
super.debugFillDescription(description); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment