Skip to content

Instantly share code, notes, and snippets.

@MacDeveloper1
Created September 6, 2023 11:04
Show Gist options
  • Save MacDeveloper1/b1f629aebf9516c6850a62b153b0e267 to your computer and use it in GitHub Desktop.
Save MacDeveloper1/b1f629aebf9516c6850a62b153b0e267 to your computer and use it in GitHub Desktop.
DebouncedScrollController
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