mirror of
https://github.com/gskinnerTeam/flutter-wonderous-app.git
synced 2025-05-20 06:16:23 +08:00
Fair bit of code cleanup.
This commit is contained in:
@ -64,21 +64,23 @@ class _EightWaySwipeDetectorState extends State<EightWaySwipeDetector> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return TrackpadListener(
|
||||
scrollSensitivity: 70,
|
||||
onScroll: _trackpadSwipe,
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onPanStart: _handleSwipeStart,
|
||||
onPanUpdate: _handleSwipeUpdate,
|
||||
onPanCancel: _resetSwipe,
|
||||
onPanEnd: _handleSwipeEnd,
|
||||
supportedDevices: const {
|
||||
// Purposely omitting PointerDeviceKind.trackpad.
|
||||
PointerDeviceKind.mouse,
|
||||
PointerDeviceKind.stylus,
|
||||
PointerDeviceKind.touch,
|
||||
PointerDeviceKind.unknown,
|
||||
},
|
||||
child: widget.child),
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onPanStart: _handleSwipeStart,
|
||||
onPanUpdate: _handleSwipeUpdate,
|
||||
onPanCancel: _resetSwipe,
|
||||
onPanEnd: _handleSwipeEnd,
|
||||
supportedDevices: const {
|
||||
// Purposely omitting PointerDeviceKind.trackpad.
|
||||
PointerDeviceKind.mouse,
|
||||
PointerDeviceKind.stylus,
|
||||
PointerDeviceKind.touch,
|
||||
PointerDeviceKind.unknown,
|
||||
},
|
||||
child: widget.child,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -6,20 +6,12 @@ import 'package:wonders/common_libs.dart';
|
||||
class TrackpadListener extends StatefulWidget {
|
||||
final Widget child;
|
||||
final double scrollSensitivity;
|
||||
final void Function()? onScrollUp;
|
||||
final void Function()? onScrollDown;
|
||||
final void Function()? onScrollLeft;
|
||||
final void Function()? onScrollRight;
|
||||
final void Function(Offset delta)? onScroll;
|
||||
|
||||
const TrackpadListener({
|
||||
super.key,
|
||||
required this.child,
|
||||
this.scrollSensitivity = 100,
|
||||
this.onScrollUp,
|
||||
this.onScrollDown,
|
||||
this.onScrollLeft,
|
||||
this.onScrollRight,
|
||||
this.onScroll,
|
||||
});
|
||||
|
||||
@ -29,48 +21,46 @@ class TrackpadListener extends StatefulWidget {
|
||||
|
||||
class _TrackpadListenerState extends State<TrackpadListener> {
|
||||
Offset _scrollOffset = Offset.zero;
|
||||
|
||||
void _handleTrackpadEvent(PointerSignalEvent event) {
|
||||
GestureBinding.instance.pointerSignalResolver.register(event, (PointerSignalEvent event) {
|
||||
// Only handle trackpad events here.
|
||||
if (event is PointerScrollEvent && event.kind == PointerDeviceKind.trackpad) {
|
||||
Offset newScroll = _scrollOffset + event.scrollDelta;
|
||||
newScroll = Offset(
|
||||
newScroll.dx.clamp(-widget.scrollSensitivity, widget.scrollSensitivity),
|
||||
newScroll.dy.clamp(-widget.scrollSensitivity, widget.scrollSensitivity),
|
||||
);
|
||||
_update(newScroll);
|
||||
_scrollOffset = newScroll;
|
||||
_update();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void _update(Offset newOffset) {
|
||||
void _update() {
|
||||
Offset directionScroll = Offset.zero;
|
||||
double sensitivity = widget.scrollSensitivity;
|
||||
while (newOffset.dy >= sensitivity) {
|
||||
widget.onScrollDown?.call();
|
||||
newOffset -= Offset(0.0, sensitivity);
|
||||
directionScroll -= Offset(0.0, 1.0);
|
||||
}
|
||||
while (newOffset.dy <= -sensitivity) {
|
||||
widget.onScrollUp?.call();
|
||||
newOffset += Offset(0.0, sensitivity);
|
||||
if (_scrollOffset.dy >= sensitivity) {
|
||||
// Scroll down
|
||||
_scrollOffset += Offset(0.0, -sensitivity);
|
||||
directionScroll += Offset(0.0, -1.0);
|
||||
} else if (_scrollOffset.dy <= -sensitivity) {
|
||||
// Scroll up
|
||||
_scrollOffset += Offset(0.0, sensitivity);
|
||||
directionScroll += Offset(0.0, 1.0);
|
||||
}
|
||||
while (newOffset.dx >= sensitivity) {
|
||||
widget.onScrollLeft?.call();
|
||||
newOffset -= Offset(sensitivity, 0.0);
|
||||
directionScroll -= Offset(1.0, 0.0);
|
||||
}
|
||||
while (newOffset.dx <= -sensitivity) {
|
||||
widget.onScrollRight?.call();
|
||||
newOffset += Offset(sensitivity, 0.0);
|
||||
if (_scrollOffset.dx >= sensitivity) {
|
||||
// Scroll left
|
||||
_scrollOffset += Offset(-sensitivity, 0.0);
|
||||
directionScroll += Offset(-1.0, 0.0);
|
||||
} else if (_scrollOffset.dx <= -sensitivity) {
|
||||
// Scroll right
|
||||
_scrollOffset += Offset(sensitivity, 0.0);
|
||||
directionScroll += Offset(1.0, 0.0);
|
||||
}
|
||||
if (directionScroll != Offset.zero) {
|
||||
widget.onScroll?.call(directionScroll);
|
||||
}
|
||||
// Tone it down over time.
|
||||
newOffset *= 0.9;
|
||||
setState(() => _scrollOffset = newOffset);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -65,9 +65,9 @@ class _WonderEditorialScreenState extends State<WonderEditorialScreen> {
|
||||
_scrollPos.value = _scroller.position.pixels;
|
||||
}
|
||||
|
||||
void _handleSwipeUp() {
|
||||
void _handleTrackpadScroll(Offset direction) {
|
||||
// Trackpad swipe up. Return to home if at the top.
|
||||
if (_scroller.position.pixels == 0) {
|
||||
if (_scroller.position.pixels == 0 && direction.dy > 0) {
|
||||
_handleBackPressed();
|
||||
}
|
||||
}
|
||||
@ -89,7 +89,7 @@ class _WonderEditorialScreenState extends State<WonderEditorialScreen> {
|
||||
child: ColoredBox(
|
||||
color: $styles.colors.offWhite,
|
||||
child: TrackpadListener(
|
||||
onScrollUp: _handleSwipeUp,
|
||||
onScroll: _handleTrackpadScroll,
|
||||
scrollSensitivity: 120,
|
||||
child: Stack(
|
||||
children: [
|
||||
|
@ -132,6 +132,12 @@ class _HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateM
|
||||
}
|
||||
}
|
||||
|
||||
void _handleTrackpadScroll(Offset direction) {
|
||||
if (direction.dy < 0) {
|
||||
_showDetailsPage();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_fadeInOnNextBuild == true) {
|
||||
@ -143,7 +149,7 @@ class _HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateM
|
||||
color: $styles.colors.black,
|
||||
child: TrackpadListener(
|
||||
scrollSensitivity: 60,
|
||||
onScrollDown: () => _showDetailsPage(),
|
||||
onScroll: _handleTrackpadScroll,
|
||||
child: PreviousNextNavigation(
|
||||
listenToMouseWheel: false,
|
||||
onPreviousPressed: () => _handlePrevNext(-1),
|
||||
|
Reference in New Issue
Block a user