diff --git a/lib/theme/durations.dart b/lib/theme/durations.dart index a91ba9123..058206239 100644 --- a/lib/theme/durations.dart +++ b/lib/theme/durations.dart @@ -1,7 +1,4 @@ -import 'package:aves/model/settings/enums/accessibility_animations.dart'; -import 'package:aves/model/settings/settings.dart'; -import 'package:flutter/widgets.dart'; -import 'package:provider/provider.dart'; +import 'package:flutter/foundation.dart'; class Durations { // Flutter animations (with margin) @@ -72,26 +69,6 @@ class Durations { static const mapIdleDebounceDelay = Duration(milliseconds: 100); } -class DurationsProvider extends StatelessWidget { - final Widget child; - - const DurationsProvider({ - super.key, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return ProxyProvider( - update: (context, settings, __) { - final enabled = settings.accessibilityAnimations.animate; - return enabled ? DurationsData() : DurationsData.noAnimation(); - }, - child: child, - ); - } -} - @immutable class DurationsData { // common animations diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index f8e785b7c..211f883e2 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -33,6 +33,7 @@ import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/route_tracker.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/providers/durations_provider.dart'; import 'package:aves/widgets/common/providers/highlight_info_provider.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/home_page.dart'; @@ -190,95 +191,87 @@ class _AvesAppState extends State with WidgetsBindingObserver { Widget build(BuildContext context) { // place the settings provider above `MaterialApp` // so it can be used during navigation transitions - return Provider.value( - value: widget.flavor, - child: ChangeNotifierProvider.value( - value: settings, - child: ListenableProvider>.value( - value: _appModeNotifier, - child: Provider.value( - value: _mediaStoreSource, - child: Provider.value( - value: _tvRailController, - child: DurationsProvider( - child: HighlightInfoProvider( - child: OverlaySupport( - child: FutureBuilder( - future: _appSetup, - builder: (context, snapshot) { - final initialized = !snapshot.hasError && snapshot.connectionState == ConnectionState.done; - if (initialized) { - AvesApp.showSystemUI(); - } - final home = initialized - ? _getFirstPage() - : AvesScaffold( - body: snapshot.hasError ? _buildError(snapshot.error!) : const SizedBox(), - ); - return Selector>( - selector: (context, s) => Tuple3( - s.locale, - s.initialized ? s.themeBrightness : SettingsDefaults.themeBrightness, - s.initialized ? s.enableDynamicColor : SettingsDefaults.enableDynamicColor, - ), - builder: (context, s, child) { - final settingsLocale = s.item1; - final themeBrightness = s.item2; - final enableDynamicColor = s.item3; - - Constants.updateStylesForLocale(settings.appliedLocale); - - return FutureBuilder( - future: _dynamicColorPaletteLoader, - builder: (context, snapshot) { - const defaultAccent = Themes.defaultAccent; - Color lightAccent = defaultAccent, darkAccent = defaultAccent; - if (enableDynamicColor) { - // `DynamicColorBuilder` from package `dynamic_color` provides light/dark - // palettes with a primary color from tones too dark/light (40/80), - // so we derive the color with adjusted tones (60/70) - final tonalPalette = snapshot.data?.primary; - lightAccent = Color(tonalPalette?.get(60) ?? defaultAccent.value); - darkAccent = Color(tonalPalette?.get(70) ?? defaultAccent.value); - } - final lightTheme = Themes.lightTheme(lightAccent, initialized); - final darkTheme = themeBrightness == AvesThemeBrightness.black ? Themes.blackTheme(darkAccent, initialized) : Themes.darkTheme(darkAccent, initialized); - return Shortcuts( - shortcuts: { - // handle Android TV remote `select` button - LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), - }, - child: MaterialApp( - navigatorKey: AvesApp.navigatorKey, - home: home, - navigatorObservers: _navigatorObservers, - builder: (context, child) => _decorateAppChild( - context: context, - initialized: initialized, - child: child, - ), - onGenerateTitle: (context) => context.l10n.appName, - theme: lightTheme, - darkTheme: darkTheme, - themeMode: themeBrightness.appThemeMode, - locale: settingsLocale, - localizationsDelegates: AppLocalizations.localizationsDelegates, - supportedLocales: AvesApp.supportedLocales, - // TODO TLAD remove custom scroll behavior when this is fixed: https://github.com/flutter/flutter/issues/82906 - scrollBehavior: StretchMaterialScrollBehavior(), - ), - ); - }, - ); - }, - ); - }, - ), - ), - ), + return MultiProvider( + providers: [ + Provider.value(value: widget.flavor), + ChangeNotifierProvider.value(value: settings), + ListenableProvider>.value(value: _appModeNotifier), + Provider.value(value: _mediaStoreSource), + Provider.value(value: _tvRailController), + DurationsProvider(), + HighlightInfoProvider(), + ], + child: OverlaySupport( + child: FutureBuilder( + future: _appSetup, + builder: (context, snapshot) { + final initialized = !snapshot.hasError && snapshot.connectionState == ConnectionState.done; + if (initialized) { + AvesApp.showSystemUI(); + } + final home = initialized + ? _getFirstPage() + : AvesScaffold( + body: snapshot.hasError ? _buildError(snapshot.error!) : const SizedBox(), + ); + return Selector>( + selector: (context, s) => Tuple3( + s.locale, + s.initialized ? s.themeBrightness : SettingsDefaults.themeBrightness, + s.initialized ? s.enableDynamicColor : SettingsDefaults.enableDynamicColor, ), - ), - ), + builder: (context, s, child) { + final settingsLocale = s.item1; + final themeBrightness = s.item2; + final enableDynamicColor = s.item3; + + Constants.updateStylesForLocale(settings.appliedLocale); + + return FutureBuilder( + future: _dynamicColorPaletteLoader, + builder: (context, snapshot) { + const defaultAccent = Themes.defaultAccent; + Color lightAccent = defaultAccent, darkAccent = defaultAccent; + if (enableDynamicColor) { + // `DynamicColorBuilder` from package `dynamic_color` provides light/dark + // palettes with a primary color from tones too dark/light (40/80), + // so we derive the color with adjusted tones (60/70) + final tonalPalette = snapshot.data?.primary; + lightAccent = Color(tonalPalette?.get(60) ?? defaultAccent.value); + darkAccent = Color(tonalPalette?.get(70) ?? defaultAccent.value); + } + final lightTheme = Themes.lightTheme(lightAccent, initialized); + final darkTheme = themeBrightness == AvesThemeBrightness.black ? Themes.blackTheme(darkAccent, initialized) : Themes.darkTheme(darkAccent, initialized); + return Shortcuts( + shortcuts: { + // handle Android TV remote `select` button + LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), + }, + child: MaterialApp( + navigatorKey: AvesApp.navigatorKey, + home: home, + navigatorObservers: _navigatorObservers, + builder: (context, child) => _decorateAppChild( + context: context, + initialized: initialized, + child: child, + ), + onGenerateTitle: (context) => context.l10n.appName, + theme: lightTheme, + darkTheme: darkTheme, + themeMode: themeBrightness.appThemeMode, + locale: settingsLocale, + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AvesApp.supportedLocales, + // TODO TLAD remove custom scroll behavior when this is fixed: https://github.com/flutter/flutter/issues/82906 + scrollBehavior: StretchMaterialScrollBehavior(), + ), + ); + }, + ); + }, + ); + }, ), ), ); diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index bf0c69973..85435a667 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -19,7 +19,7 @@ import 'package:aves/widgets/collection/draggable_thumb_label.dart'; import 'package:aves/widgets/collection/grid/list_details_theme.dart'; import 'package:aves/widgets/collection/grid/section_layout.dart'; import 'package:aves/widgets/collection/grid/tile.dart'; -import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scrollbar.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/behaviour/sloppy_scroll_physics.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 37d8cdb59..1b88caeba 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -14,7 +14,7 @@ import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/intent_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; -import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; @@ -52,7 +52,7 @@ class CollectionPage extends StatefulWidget { class _CollectionPageState extends State { final List _subscriptions = []; late CollectionLens _collection; - final StreamController _draggableScrollBarEventStreamController = StreamController.broadcast(); + final StreamController _draggableScrollBarEventStreamController = StreamController.broadcast(); final DoubleBackPopHandler _doubleBackPopHandler = DoubleBackPopHandler(); @override @@ -146,7 +146,7 @@ class _CollectionPageState extends State { final canNavigate = context.select, bool>((v) => v.value.canNavigate); final showBottomNavigationBar = canNavigate && enableBottomNavigationBar; - return NotificationListener( + return NotificationListener( onNotification: (notification) { _draggableScrollBarEventStreamController.add(notification.event); return false; diff --git a/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart b/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart new file mode 100644 index 000000000..e665bcc68 --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart @@ -0,0 +1,38 @@ +import 'package:flutter/rendering.dart'; + +class ArrowClipper extends CustomClipper { + @override + Path getClip(Size size) { + final path = Path(); + path.lineTo(0.0, size.height); + path.lineTo(size.width, size.height); + path.lineTo(size.width, 0.0); + path.lineTo(0.0, 0.0); + path.close(); + + const arrowWidth = 8.0; + final startPointX = (size.width - arrowWidth) / 2; + var startPointY = size.height / 2 - arrowWidth / 2; + path.moveTo(startPointX, startPointY); + path.lineTo(startPointX + arrowWidth / 2, startPointY - arrowWidth / 2); + path.lineTo(startPointX + arrowWidth, startPointY); + path.lineTo(startPointX + arrowWidth, startPointY + 1.0); + path.lineTo(startPointX + arrowWidth / 2, startPointY - arrowWidth / 2 + 1.0); + path.lineTo(startPointX, startPointY + 1.0); + path.close(); + + startPointY = size.height / 2 + arrowWidth / 2; + path.moveTo(startPointX + arrowWidth, startPointY); + path.lineTo(startPointX + arrowWidth / 2, startPointY + arrowWidth / 2); + path.lineTo(startPointX, startPointY); + path.lineTo(startPointX, startPointY - 1.0); + path.lineTo(startPointX + arrowWidth / 2, startPointY + arrowWidth / 2 - 1.0); + path.lineTo(startPointX + arrowWidth, startPointY - 1.0); + path.close(); + + return path; + } + + @override + bool shouldReclip(covariant CustomClipper oldClipper) => false; +} diff --git a/lib/widgets/common/basic/draggable_scrollbar/notifications.dart b/lib/widgets/common/basic/draggable_scrollbar/notifications.dart new file mode 100644 index 000000000..28ca11d23 --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/notifications.dart @@ -0,0 +1,10 @@ +import 'package:flutter/widgets.dart'; + +@immutable +class DraggableScrollbarNotification extends Notification { + final DraggableScrollbarEvent event; + + const DraggableScrollbarNotification(this.event); +} + +enum DraggableScrollbarEvent { dragStart, dragEnd } diff --git a/lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart b/lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart new file mode 100644 index 000000000..e42c171be --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/scroll_label.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +class ScrollLabel extends StatelessWidget { + final Animation animation; + final Color backgroundColor; + final Widget child; + + const ScrollLabel({ + super.key, + required this.child, + required this.animation, + required this.backgroundColor, + }); + + @override + Widget build(BuildContext context) { + return FadeTransition( + opacity: animation, + child: Container( + margin: const EdgeInsetsDirectional.only(end: 12.0), + child: Material( + elevation: 4.0, + color: backgroundColor, + borderRadius: const BorderRadius.all(Radius.circular(16)), + child: child, + ), + ), + ); + } +} diff --git a/lib/widgets/common/basic/draggable_scrollbar.dart b/lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart similarity index 78% rename from lib/widgets/common/basic/draggable_scrollbar.dart rename to lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart index 4e31017b7..564ed445b 100644 --- a/lib/widgets/common/basic/draggable_scrollbar.dart +++ b/lib/widgets/common/basic/draggable_scrollbar/scrollbar.dart @@ -1,7 +1,9 @@ import 'dart:async'; -import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:flutter/material.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scroll_label.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/transition.dart'; +import 'package:flutter/widgets.dart'; /* adapted from package `draggable_scrollbar` v0.0.4: @@ -109,35 +111,6 @@ class DraggableScrollbar extends StatefulWidget { } } -class ScrollLabel extends StatelessWidget { - final Animation animation; - final Color backgroundColor; - final Widget child; - - const ScrollLabel({ - super.key, - required this.child, - required this.animation, - required this.backgroundColor, - }); - - @override - Widget build(BuildContext context) { - return FadeTransition( - opacity: animation, - child: Container( - margin: const EdgeInsetsDirectional.only(end: 12.0), - child: Material( - elevation: 4.0, - color: backgroundColor, - borderRadius: const BorderRadius.all(Radius.circular(16)), - child: child, - ), - ), - ); - } -} - class _DraggableScrollbarState extends State with TickerProviderStateMixin { final ValueNotifier _thumbOffsetNotifier = ValueNotifier(0), _viewOffsetNotifier = ValueNotifier(0); bool _isDragInProcess = false; @@ -304,7 +277,7 @@ class _DraggableScrollbarState extends State with TickerProv } void _onVerticalDragStart() { - const DraggableScrollBarNotification(DraggableScrollBarEvent.dragStart).dispatch(context); + const DraggableScrollbarNotification(DraggableScrollbarEvent.dragStart).dispatch(context); _labelAnimationController.forward(); _fadeoutTimer?.cancel(); _showThumb(); @@ -326,7 +299,7 @@ class _DraggableScrollbarState extends State with TickerProv } void _onVerticalDragEnd() { - const DraggableScrollBarNotification(DraggableScrollBarEvent.dragEnd).dispatch(context); + const DraggableScrollbarNotification(DraggableScrollbarEvent.dragEnd).dispatch(context); _scheduleFadeout(); setState(() => _isDragInProcess = false); } @@ -373,79 +346,3 @@ class _DraggableScrollbarState extends State with TickerProv } } } - -///This cut 2 lines in arrow shape -class ArrowClipper extends CustomClipper { - @override - Path getClip(Size size) { - final path = Path(); - path.lineTo(0.0, size.height); - path.lineTo(size.width, size.height); - path.lineTo(size.width, 0.0); - path.lineTo(0.0, 0.0); - path.close(); - - const arrowWidth = 8.0; - final startPointX = (size.width - arrowWidth) / 2; - var startPointY = size.height / 2 - arrowWidth / 2; - path.moveTo(startPointX, startPointY); - path.lineTo(startPointX + arrowWidth / 2, startPointY - arrowWidth / 2); - path.lineTo(startPointX + arrowWidth, startPointY); - path.lineTo(startPointX + arrowWidth, startPointY + 1.0); - path.lineTo(startPointX + arrowWidth / 2, startPointY - arrowWidth / 2 + 1.0); - path.lineTo(startPointX, startPointY + 1.0); - path.close(); - - startPointY = size.height / 2 + arrowWidth / 2; - path.moveTo(startPointX + arrowWidth, startPointY); - path.lineTo(startPointX + arrowWidth / 2, startPointY + arrowWidth / 2); - path.lineTo(startPointX, startPointY); - path.lineTo(startPointX, startPointY - 1.0); - path.lineTo(startPointX + arrowWidth / 2, startPointY + arrowWidth / 2 - 1.0); - path.lineTo(startPointX + arrowWidth, startPointY - 1.0); - path.close(); - - return path; - } - - @override - bool shouldReclip(covariant CustomClipper oldClipper) => false; -} - -class SlideFadeTransition extends StatelessWidget { - final Animation animation; - final Widget child; - - const SlideFadeTransition({ - super.key, - required this.animation, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: animation, - builder: (context, child) => animation.value == 0.0 ? Container() : child!, - child: SlideTransition( - position: Tween( - begin: Offset((context.isRtl ? -1 : 1) * .3, 0), - end: Offset.zero, - ).animate(animation), - child: FadeTransition( - opacity: animation, - child: child, - ), - ), - ); - } -} - -@immutable -class DraggableScrollBarNotification extends Notification { - final DraggableScrollBarEvent event; - - const DraggableScrollBarNotification(this.event); -} - -enum DraggableScrollBarEvent { dragStart, dragEnd } diff --git a/lib/widgets/common/basic/draggable_scrollbar/transition.dart b/lib/widgets/common/basic/draggable_scrollbar/transition.dart new file mode 100644 index 000000000..2eeb3a371 --- /dev/null +++ b/lib/widgets/common/basic/draggable_scrollbar/transition.dart @@ -0,0 +1,31 @@ +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +class SlideFadeTransition extends StatelessWidget { + final Animation animation; + final Widget child; + + const SlideFadeTransition({ + super.key, + required this.animation, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: animation, + builder: (context, child) => animation.value == 0.0 ? Container() : child!, + child: SlideTransition( + position: Tween( + begin: Offset((context.isRtl ? -1 : 1) * .3, 0), + end: Offset.zero, + ).animate(animation), + child: FadeTransition( + opacity: animation, + child: child, + ), + ), + ); + } +} diff --git a/lib/widgets/common/identity/scroll_thumb.dart b/lib/widgets/common/identity/scroll_thumb.dart index 4fdf08c40..718abf288 100644 --- a/lib/widgets/common/identity/scroll_thumb.dart +++ b/lib/widgets/common/identity/scroll_thumb.dart @@ -1,4 +1,5 @@ -import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/arrow_clipper.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scrollbar.dart'; import 'package:flutter/material.dart'; const double avesScrollThumbHeight = 48; diff --git a/lib/widgets/common/providers/durations_provider.dart b/lib/widgets/common/providers/durations_provider.dart new file mode 100644 index 000000000..4e1382e8f --- /dev/null +++ b/lib/widgets/common/providers/durations_provider.dart @@ -0,0 +1,16 @@ +import 'package:aves/model/settings/enums/accessibility_animations.dart'; +import 'package:aves/model/settings/settings.dart'; +import 'package:aves/theme/durations.dart'; +import 'package:provider/provider.dart'; + +class DurationsProvider extends ProxyProvider { + DurationsProvider({ + super.key, + super.child, + }) : super( + update: (context, settings, __) { + final enabled = settings.accessibilityAnimations.animate; + return enabled ? DurationsData() : DurationsData.noAnimation(); + }, + ); +} diff --git a/lib/widgets/common/providers/highlight_info_provider.dart b/lib/widgets/common/providers/highlight_info_provider.dart index cdcb7a980..9deccf7bb 100644 --- a/lib/widgets/common/providers/highlight_info_provider.dart +++ b/lib/widgets/common/providers/highlight_info_provider.dart @@ -1,20 +1,11 @@ import 'package:aves/model/highlight.dart'; -import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; -class HighlightInfoProvider extends StatelessWidget { - final Widget child; - - const HighlightInfoProvider({ +class HighlightInfoProvider extends ChangeNotifierProvider { + HighlightInfoProvider({ super.key, - required this.child, - }); - - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (context) => HighlightInfo(), - child: child, - ); - } + super.child, + }) : super( + create: (context) => HighlightInfo(), + ); } diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 9e6ca391a..38d773180 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -12,7 +12,8 @@ import 'package:aves/model/source/enums/enums.dart'; import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/theme/colors.dart'; import 'package:aves/theme/durations.dart'; -import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/scrollbar.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; @@ -61,7 +62,7 @@ class FilterGridPage extends StatelessWidget { final QueryTest applyQuery; final Widget Function() emptyBuilder; final HeroType heroType; - final StreamController _draggableScrollBarEventStreamController = StreamController.broadcast(); + final StreamController _draggableScrollBarEventStreamController = StreamController.broadcast(); FilterGridPage({ super.key, @@ -145,7 +146,7 @@ class FilterGridPage extends StatelessWidget { final canNavigate = context.select, bool>((v) => v.value.canNavigate); final showBottomNavigationBar = canNavigate && enableBottomNavigationBar; - return NotificationListener( + return NotificationListener( onNotification: (notification) { _draggableScrollBarEventStreamController.add(notification.event); return false; diff --git a/lib/widgets/navigation/nav_bar/floating.dart b/lib/widgets/navigation/nav_bar/floating.dart index 9c2ae9946..6ebb4bfdd 100644 --- a/lib/widgets/navigation/nav_bar/floating.dart +++ b/lib/widgets/navigation/nav_bar/floating.dart @@ -1,12 +1,12 @@ import 'dart:async'; import 'dart:math'; -import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; import 'package:flutter/material.dart'; class FloatingNavBar extends StatefulWidget { final ScrollController? scrollController; - final Stream events; + final Stream events; final double childHeight; final Widget child; @@ -109,12 +109,12 @@ class _FloatingNavBarState extends State with SingleTickerProvid } } - void _onDraggableScrollBarEvent(DraggableScrollBarEvent event) { + void _onDraggableScrollBarEvent(DraggableScrollbarEvent event) { switch (event) { - case DraggableScrollBarEvent.dragStart: + case DraggableScrollbarEvent.dragStart: _isDragging = true; break; - case DraggableScrollBarEvent.dragEnd: + case DraggableScrollbarEvent.dragEnd: _isDragging = false; break; } diff --git a/lib/widgets/navigation/nav_bar/nav_bar.dart b/lib/widgets/navigation/nav_bar/nav_bar.dart index 899fc89d5..bd772bd6e 100644 --- a/lib/widgets/navigation/nav_bar/nav_bar.dart +++ b/lib/widgets/navigation/nav_bar/nav_bar.dart @@ -5,7 +5,7 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/widgets/collection/collection_page.dart'; -import 'package:aves/widgets/common/basic/draggable_scrollbar.dart'; +import 'package:aves/widgets/common/basic/draggable_scrollbar/notifications.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; import 'package:aves/widgets/common/identity/aves_app_bar.dart'; @@ -17,7 +17,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class AppBottomNavBar extends StatefulWidget { - final Stream events; + final Stream events; // collection loaded in the `CollectionPage`, if any final CollectionLens? currentCollection;