From aa5d0e535bdba417692b9cba46a8db26c4e656f2 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 18 Aug 2024 13:04:45 +0600 Subject: [PATCH] chore: fix detection isn't working as drag device enables drag --- lib/hooks/configurators/use_has_touch.dart | 27 +++++++++++++++++ .../configurators/use_pointer_devices.dart | 29 ------------------- lib/main.dart | 27 ++++++++++++----- 3 files changed, 46 insertions(+), 37 deletions(-) create mode 100644 lib/hooks/configurators/use_has_touch.dart delete mode 100644 lib/hooks/configurators/use_pointer_devices.dart diff --git a/lib/hooks/configurators/use_has_touch.dart b/lib/hooks/configurators/use_has_touch.dart new file mode 100644 index 00000000..75353f27 --- /dev/null +++ b/lib/hooks/configurators/use_has_touch.dart @@ -0,0 +1,27 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:spotube/utils/platform.dart'; + +bool useHasTouch() { + final hasTouch = useState(kIsMobile); + + useEffect(() { + void globalRoute(PointerEvent event) { + if (hasTouch.value) return; + hasTouch.value = event.kind == PointerDeviceKind.touch || + event.kind == PointerDeviceKind.stylus || + event.kind == PointerDeviceKind.invertedStylus; + } + + WidgetsBinding.instance.addPostFrameCallback((_) { + GestureBinding.instance.pointerRouter.addGlobalRoute(globalRoute); + }); + + return () { + GestureBinding.instance.pointerRouter.removeGlobalRoute(globalRoute); + }; + }, []); + + return hasTouch.value; +} diff --git a/lib/hooks/configurators/use_pointer_devices.dart b/lib/hooks/configurators/use_pointer_devices.dart deleted file mode 100644 index d7b378a5..00000000 --- a/lib/hooks/configurators/use_pointer_devices.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:spotube/utils/platform.dart'; - -Set usePointerDevices() { - final devices = useState>({ - if (kIsMobile) PointerDeviceKind.touch, - if (kIsDesktop || kIsWeb) PointerDeviceKind.mouse, - }); - - useEffect(() { - WidgetsBinding.instance.addPostFrameCallback((_) { - GestureBinding.instance.pointerRouter - .addGlobalRoute((PointerEvent event) { - if (devices.value.contains(event.kind)) return; - devices.value = { - ...devices.value, - event.kind, - }; - }); - }); - - return null; - }, []); - - return devices.value; -} diff --git a/lib/main.dart b/lib/main.dart index 3f060896..f13991e2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:ui'; import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:flutter/foundation.dart'; @@ -22,7 +23,7 @@ import 'package:spotube/hooks/configurators/use_deep_linking.dart'; import 'package:spotube/hooks/configurators/use_disable_battery_optimizations.dart'; import 'package:spotube/hooks/configurators/use_fix_window_stretching.dart'; import 'package:spotube/hooks/configurators/use_get_storage_perms.dart'; -import 'package:spotube/hooks/configurators/use_pointer_devices.dart'; +import 'package:spotube/hooks/configurators/use_has_touch.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/audio_player/audio_player_streams.dart'; import 'package:spotube/provider/database/database.dart'; @@ -143,7 +144,7 @@ class Spotube extends HookConsumerWidget { final paletteColor = ref.watch(paletteProvider.select((s) => s?.dominantColor?.color)); final router = ref.watch(routerProvider); - final pointerDevices = usePointerDevices(); + final hasTouchSupport = useHasTouch(); ref.listen(audioPlayerStreamListenersProvider, (_, __) {}); ref.listen(bonsoirProvider, (_, __) {}); @@ -181,10 +182,6 @@ class Spotube extends HookConsumerWidget { ); return MaterialApp.router( - scrollBehavior: const MaterialScrollBehavior() - ..copyWith( - dragDevices: pointerDevices, - ), supportedLocales: L10n.all, locale: locale.languageCode == "system" ? null : locale, localizationsDelegates: const [ @@ -197,8 +194,22 @@ class Spotube extends HookConsumerWidget { debugShowCheckedModeBanner: false, title: 'Spotube', builder: (context, child) { - if (kIsDesktop && !kIsMacOS) return DragToResizeArea(child: child!); - return child!; + child = ScrollConfiguration( + behavior: ScrollConfiguration.of(context).copyWith( + dragDevices: hasTouchSupport + ? { + PointerDeviceKind.touch, + PointerDeviceKind.stylus, + PointerDeviceKind.invertedStylus, + } + : null, + ), + child: child!, + ); + + if (kIsDesktop && !kIsMacOS) child = DragToResizeArea(child: child); + + return child; }, themeMode: themeMode, theme: lightTheme,