import 'package:PiliPlus/common/constants.dart' show StyleString; import 'package:PiliPlus/pages/home/controller.dart'; import 'package:PiliPlus/pages/main/controller.dart'; import 'package:flutter/foundation.dart' show clampDouble; import 'package:flutter/material.dart'; import 'package:get/get.dart'; abstract class CommonPageState extends State { RxDouble? _barOffset; RxBool? _showTopBar; RxBool? _showBottomBar; final _mainController = Get.find(); @override void initState() { super.initState(); _barOffset = _mainController.barOffset; _showBottomBar = _mainController.showBottomBar; try { _showTopBar = Get.find().showTopBar; } catch (_) {} } Widget onBuild(Widget child) { if (_barOffset != null) { return NotificationListener( onNotification: onNotificationType2, child: child, ); } if (_showTopBar != null || _showBottomBar != null) { return NotificationListener( onNotification: onNotificationType1, child: child, ); } return child; } bool onNotificationType1(UserScrollNotification notification) { if (!_mainController.useBottomNav) return false; if (notification.metrics.axis == .horizontal) return false; switch (notification.direction) { case .forward: _showTopBar?.value = true; _showBottomBar?.value = true; case .reverse: _showTopBar?.value = false; _showBottomBar?.value = false; case _: } return false; } void _updateOffset(double scrollDelta) { _barOffset!.value = clampDouble( _barOffset!.value + scrollDelta, 0.0, StyleString.topBarHeight, ); } bool onNotificationType2(ScrollNotification notification) { if (!_mainController.useBottomNav) return false; if (notification.metrics.axis == .horizontal) return false; if (notification is ScrollUpdateNotification) { if (notification.dragDetails == null) return false; _updateOffset(notification.scrollDelta ?? 0.0); return false; } if (notification is OverscrollNotification) { _updateOffset(notification.overscroll); return false; } return false; } @override void dispose() { _barOffset = null; _showTopBar = null; _showBottomBar = null; super.dispose(); } }