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