diff --git a/lib/common/skeleton/skeleton.dart b/lib/common/skeleton/skeleton.dart index 874652c89..e3f5edb2f 100644 --- a/lib/common/skeleton/skeleton.dart +++ b/lib/common/skeleton/skeleton.dart @@ -62,7 +62,6 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { @override void initState() { super.initState(); - _shimmerController = AnimationController.unbounded(vsync: this) ..repeat(min: -0.5, max: 1.5, period: const Duration(milliseconds: 1000)); } diff --git a/lib/common/widgets/custom_tooltip.dart b/lib/common/widgets/custom_tooltip.dart index 52696e0aa..49b258ae2 100644 --- a/lib/common/widgets/custom_tooltip.dart +++ b/lib/common/widgets/custom_tooltip.dart @@ -24,88 +24,31 @@ class CustomTooltip extends StatefulWidget { static final List _openedTooltips = []; - static bool dismissAllToolTips() { - if (_openedTooltips.isNotEmpty) { - final List openedTooltips = _openedTooltips.toList(); - for (final CustomTooltipState state in openedTooltips) { - assert(state.mounted); - state._scheduleDismissTooltip(); - } - return true; - } - return false; - } - @override State createState() => CustomTooltipState(); } class CustomTooltipState extends State with SingleTickerProviderStateMixin { - static const Duration _fadeInDuration = Duration(milliseconds: 150); - static const Duration _fadeOutDuration = Duration(milliseconds: 75); - final OverlayPortalController _overlayController = OverlayPortalController(); - AnimationController? _backingController; - AnimationController get _controller { - return _backingController ??= AnimationController( - duration: _fadeInDuration, - reverseDuration: _fadeOutDuration, - vsync: this, - )..addStatusListener(_handleStatusChanged); - } - - CurvedAnimation? _backingOverlayAnimation; - CurvedAnimation get _overlayAnimation { - return _backingOverlayAnimation ??= CurvedAnimation( - parent: _controller, - curve: Curves.fastOutSlowIn, - ); - } - LongPressGestureRecognizer? _longPressRecognizer; - AnimationStatus _animationStatus = AnimationStatus.dismissed; - void _handleStatusChanged(AnimationStatus status) { - assert(mounted); - switch ((_animationStatus.isDismissed, status.isDismissed)) { - case (false, true): - CustomTooltip._openedTooltips.remove(this); - _overlayController.hide(); - case (true, false): - _overlayController.show(); - CustomTooltip._openedTooltips.add(this); - case (true, true) || (false, false): - break; - } - _animationStatus = status; - } - void _scheduleShowTooltip() { - _controller.forward(); + _overlayController.show(); + CustomTooltip._openedTooltips.add(this); } void _scheduleDismissTooltip() { - _controller.reverse(); + CustomTooltip._openedTooltips.remove(this); + _overlayController.hide(); } void _handlePointerDown(PointerDownEvent event) { assert(mounted); - const Set triggerModeDeviceKinds = { - PointerDeviceKind.invertedStylus, - PointerDeviceKind.stylus, - PointerDeviceKind.touch, - PointerDeviceKind.unknown, - PointerDeviceKind.trackpad, - }; - _longPressRecognizer ??= LongPressGestureRecognizer( + (_longPressRecognizer ??= LongPressGestureRecognizer( debugOwner: this, - supportedDevices: triggerModeDeviceKinds, - ); - _longPressRecognizer! - ..onLongPress = _scheduleShowTooltip - ..addPointer(event); + )..onLongPress = _scheduleShowTooltip).addPointer(event); } Widget _buildCustomTooltipOverlay(BuildContext context) { @@ -123,7 +66,6 @@ class CustomTooltipState extends State verticalOffset: box.size.height / 2, horizontalOffset: box.size.width / 2, type: widget.type, - animation: _overlayAnimation, target: target, onDismiss: _scheduleDismissTooltip, overlayWidget: widget.overlayWidget, @@ -141,8 +83,6 @@ class CustomTooltipState extends State CustomTooltip._openedTooltips.remove(this); _longPressRecognizer?.onLongPressCancel = null; _longPressRecognizer?.dispose(); - _backingController?.dispose(); - _backingOverlayAnimation?.dispose(); super.dispose(); } @@ -177,7 +117,6 @@ class _CustomTooltipOverlay extends StatelessWidget { required this.verticalOffset, required this.horizontalOffset, required this.type, - required this.animation, required this.target, required this.onDismiss, required this.overlayWidget, @@ -187,7 +126,6 @@ class _CustomTooltipOverlay extends StatelessWidget { final double verticalOffset; final double horizontalOffset; final TooltipType type; - final Animation animation; final Offset target; final VoidCallback onDismiss; final Widget Function() overlayWidget; diff --git a/lib/common/widgets/gesture/mouse_interactive_viewer.dart b/lib/common/widgets/gesture/mouse_interactive_viewer.dart index 83af59fbd..dc9d7e6e6 100644 --- a/lib/common/widgets/gesture/mouse_interactive_viewer.dart +++ b/lib/common/widgets/gesture/mouse_interactive_viewer.dart @@ -81,7 +81,9 @@ class _MouseInteractiveViewerState extends State final GlobalKey _parentKey = GlobalKey(); Animation? _animation; + CurvedAnimation? _curvedAnimation; Animation? _scaleAnimation; + CurvedAnimation? _curvedScaleAnimation; late Offset _scaleAnimationFocalPoint; late AnimationController _controller; late AnimationController _scaleController; @@ -96,17 +98,7 @@ class _MouseInteractiveViewerState extends State touchSlop: Platform.isIOS ? 9 : 4, ); - late final _scaleGestureRecognizer = - ScaleGestureRecognizer( - debugOwner: this, - allowedButtonsFilter: (buttons) => buttons == kPrimaryButton, - trackpadScrollToScaleFactor: Offset(0, -1 / widget.scaleFactor), - trackpadScrollCausesScale: widget.trackpadScrollCausesScale, - ) - ..gestureSettings = gestureSettings - ..onStart = _onScaleStart - ..onUpdate = _onScaleUpdate - ..onEnd = _onScaleEnd; + late final ScaleGestureRecognizer _scaleGestureRecognizer; final bool _rotateEnabled = false; @@ -451,7 +443,10 @@ class _MouseInteractiveViewerState extends State frictionSimulationY.finalX, ), ).animate( - CurvedAnimation(parent: _controller, curve: Curves.decelerate), + _curvedAnimation ??= CurvedAnimation( + parent: _controller, + curve: Curves.decelerate, + ), ) ..addListener(_handleInertiaAnimation); _controller @@ -478,7 +473,7 @@ class _MouseInteractiveViewerState extends State begin: scale, end: frictionSimulation.x(tFinal), ).animate( - CurvedAnimation( + _curvedScaleAnimation ??= CurvedAnimation( parent: _scaleController, curve: Curves.decelerate, ), @@ -700,6 +695,17 @@ class _MouseInteractiveViewerState extends State @override void initState() { super.initState(); + _scaleGestureRecognizer = + ScaleGestureRecognizer( + debugOwner: this, + allowedButtonsFilter: (buttons) => buttons == kPrimaryButton, + trackpadScrollToScaleFactor: Offset(0, -1 / widget.scaleFactor), + trackpadScrollCausesScale: widget.trackpadScrollCausesScale, + ) + ..gestureSettings = gestureSettings + ..onStart = _onScaleStart + ..onUpdate = _onScaleUpdate + ..onEnd = _onScaleEnd; _controller = AnimationController(vsync: this); _scaleController = AnimationController(vsync: this); @@ -726,7 +732,9 @@ class _MouseInteractiveViewerState extends State @override void dispose() { _scaleGestureRecognizer.dispose(); + _curvedAnimation?.dispose(); _controller.dispose(); + _curvedScaleAnimation?.dispose(); _scaleController.dispose(); _transformer.removeListener(_handleTransformation); if (widget.transformationController == null) { diff --git a/lib/common/widgets/interactiveviewer_gallery/hero_dialog_route.dart b/lib/common/widgets/interactiveviewer_gallery/hero_dialog_route.dart index 04e6beeba..5504ffba7 100644 --- a/lib/common/widgets/interactiveviewer_gallery/hero_dialog_route.dart +++ b/lib/common/widgets/interactiveviewer_gallery/hero_dialog_route.dart @@ -31,6 +31,18 @@ class HeroDialogRoute extends PageRoute { @override Color? get barrierColor => null; + CurvedAnimation? _curvedAnimation; + + void _setAnimation(Animation animation) { + if (_curvedAnimation?.parent != animation) { + _curvedAnimation?.dispose(); + _curvedAnimation = CurvedAnimation( + parent: animation, + curve: Curves.easeOut, + ); + } + } + @override Widget buildTransitions( BuildContext context, @@ -38,12 +50,19 @@ class HeroDialogRoute extends PageRoute { Animation secondaryAnimation, Widget child, ) { + _setAnimation(animation); return FadeTransition( - opacity: CurvedAnimation(parent: animation, curve: Curves.easeOut), + opacity: _curvedAnimation!, child: child, ); } + @override + void dispose() { + _curvedAnimation?.dispose(); + super.dispose(); + } + @override Widget buildPage( BuildContext context, diff --git a/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart b/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart index 6a8eabd93..8a9ae7d8d 100644 --- a/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart +++ b/lib/common/widgets/interactiveviewer_gallery/interactive_viewer.dart @@ -503,7 +503,9 @@ class _InteractiveViewerState extends State final GlobalKey _childKey = GlobalKey(); final GlobalKey _parentKey = GlobalKey(); Animation? _animation; + CurvedAnimation? _curvedAnimation; Animation? _scaleAnimation; + CurvedAnimation? _curvedScaleAnimation; late Offset _scaleAnimationFocalPoint; late AnimationController _controller; late AnimationController _scaleController; @@ -930,7 +932,10 @@ class _InteractiveViewerState extends State frictionSimulationY.finalX, ), ).animate( - CurvedAnimation(parent: _controller, curve: Curves.decelerate), + _curvedAnimation ??= CurvedAnimation( + parent: _controller, + curve: Curves.decelerate, + ), ); _controller.duration = Duration(milliseconds: (tFinal * 1000).round()); _animation!.addListener(_handleInertiaAnimation); @@ -956,7 +961,7 @@ class _InteractiveViewerState extends State begin: scale, end: frictionSimulation.x(tFinal), ).animate( - CurvedAnimation( + _curvedScaleAnimation ??= CurvedAnimation( parent: _scaleController, curve: Curves.decelerate, ), @@ -1150,7 +1155,9 @@ class _InteractiveViewerState extends State @override void dispose() { + _curvedAnimation?.dispose(); _controller.dispose(); + _curvedScaleAnimation?.dispose(); _scaleController.dispose(); _transformer.removeListener(_handleTransformation); if (widget.transformationController == null) { diff --git a/lib/http/download.dart b/lib/http/download.dart index 92ad6a963..a3d4cac56 100644 --- a/lib/http/download.dart +++ b/lib/http/download.dart @@ -11,7 +11,6 @@ import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/video_utils.dart'; -import 'package:get/get_utils/get_utils.dart'; abstract final class DownloadHttp { static const String referer = "https://www.bilibili.com/"; diff --git a/lib/main.dart b/lib/main.dart index a5d9f1f81..6f279c31f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,6 +15,7 @@ import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/cache_manager.dart'; import 'package:PiliPlus/utils/calc_window_position.dart'; import 'package:PiliPlus/utils/date_utils.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/json_file_handler.dart'; import 'package:PiliPlus/utils/page_utils.dart'; @@ -229,7 +230,7 @@ class MyApp extends StatelessWidget { return; } - if (Get.isDialogOpen ?? Get.isBottomSheetOpen ?? false) { + if (Get.routing.route is! GetPageRoute) { Get.back(); return; } diff --git a/lib/pages/about/view.dart b/lib/pages/about/view.dart index be814540b..157ca7ef8 100644 --- a/lib/pages/about/view.dart +++ b/lib/pages/about/view.dart @@ -22,7 +22,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide ListTile; import 'package:flutter/services.dart' show Clipboard, ClipboardData; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:re_highlight/languages/json.dart'; diff --git a/lib/pages/article/view.dart b/lib/pages/article/view.dart index 5bd7d3c6a..28dab1066 100644 --- a/lib/pages/article/view.dart +++ b/lib/pages/article/view.dart @@ -25,7 +25,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:html/parser.dart' as parser; class ArticlePage extends StatefulWidget { diff --git a/lib/pages/article/widgets/opus_content.dart b/lib/pages/article/widgets/opus_content.dart index 906f3d9d2..f63da479d 100644 --- a/lib/pages/article/widgets/opus_content.dart +++ b/lib/pages/article/widgets/opus_content.dart @@ -19,7 +19,8 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss, Node; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_navigation/src/extension_navigation.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:re_highlight/languages/all.dart'; import 'package:re_highlight/re_highlight.dart'; diff --git a/lib/pages/audio/controller.dart b/lib/pages/audio/controller.dart index 858163ad5..46f2ea0ef 100644 --- a/lib/pages/audio/controller.dart +++ b/lib/pages/audio/controller.dart @@ -60,10 +60,7 @@ class AudioController extends GetxController final Rx position = Duration.zero.obs; final Rx duration = Duration.zero.obs; - late final AnimationController animController = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 200), - ); + late final AnimationController animController; Set? _subscriptions; @@ -127,6 +124,11 @@ class AudioController extends GetxController ?..onPlay = onPlay ..onPause = onPause ..onSeek = onSeek; + + animController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 200), + ); } Future onPlay() async { diff --git a/lib/pages/audio/view.dart b/lib/pages/audio/view.dart index dbfa9fe00..4b0d43985 100644 --- a/lib/pages/audio/view.dart +++ b/lib/pages/audio/view.dart @@ -13,6 +13,7 @@ import 'package:PiliPlus/pages/video/introduction/ugc/widgets/action_item.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; +import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; diff --git a/lib/pages/common/common_intro_controller.dart b/lib/pages/common/common_intro_controller.dart index 05fd71713..9ffa86390 100644 --- a/lib/pages/common/common_intro_controller.dart +++ b/lib/pages/common/common_intro_controller.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/models_new/video/video_tag/data.dart'; import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/widgets/triple_mixin.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; diff --git a/lib/pages/common/dyn/common_dyn_page.dart b/lib/pages/common/dyn/common_dyn_page.dart index 7448cd2f2..80990114f 100644 --- a/lib/pages/common/dyn/common_dyn_page.dart +++ b/lib/pages/common/dyn/common_dyn_page.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart'; import 'package:PiliPlus/pages/video/reply/widgets/reply_item_grpc.dart'; import 'package:PiliPlus/pages/video/reply_reply/view.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/num_utils.dart'; @@ -17,13 +18,13 @@ import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; abstract class CommonDynPageState extends State with SingleTickerProviderStateMixin { CommonDynController get controller; - late final scrollController = ScrollController()..addListener(listener); + late final ScrollController scrollController; bool get horizontalPreview => !isPortrait && controller.horizontalPreview; @@ -37,15 +38,27 @@ abstract class CommonDynPageState extends State final fabOffset = const Offset(0, 1); - late final AnimationController fabAnimationCtr = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 300), - )..forward(); + late final AnimationController _fabAnimationCtr; + late final CurvedAnimation _curvedAnimation; + late final Animation fabAnim; - late final Animation fabAnim = Tween( - begin: fabOffset, - end: Offset.zero, - ).animate(CurvedAnimation(parent: fabAnimationCtr, curve: Curves.easeInOut)); + @override + void initState() { + super.initState(); + _fabAnimationCtr = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 200), + )..forward(); + _curvedAnimation = CurvedAnimation( + parent: _fabAnimationCtr, + curve: Curves.easeInOut, + ); + fabAnim = Tween( + begin: fabOffset, + end: Offset.zero, + ).animate(_curvedAnimation); + scrollController = ScrollController()..addListener(listener); + } void listener() { final pos = scrollController.positions; @@ -60,14 +73,14 @@ abstract class CommonDynPageState extends State void showFab() { if (!_showFab) { _showFab = true; - fabAnimationCtr.forward(); + _fabAnimationCtr.forward(); } } void hideFab() { if (_showFab) { _showFab = false; - fabAnimationCtr.reverse(); + _fabAnimationCtr.reverse(); } } @@ -85,6 +98,8 @@ abstract class CommonDynPageState extends State scrollController ..removeListener(listener) ..dispose(); + _curvedAnimation.dispose(); + _fabAnimationCtr.dispose(); super.dispose(); } diff --git a/lib/pages/common/publish/common_publish_page.dart b/lib/pages/common/publish/common_publish_page.dart index ab1b16980..b1fbe0134 100644 --- a/lib/pages/common/publish/common_publish_page.dart +++ b/lib/pages/common/publish/common_publish_page.dart @@ -6,7 +6,7 @@ import 'package:PiliPlus/models/common/publish_panel_type.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:chat_bottom_container/chat_bottom_container.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; abstract class CommonPublishPage extends StatefulWidget { const CommonPublishPage({ @@ -26,7 +26,7 @@ abstract class CommonPublishPage extends StatefulWidget { abstract class CommonPublishPageState extends State with WidgetsBindingObserver { - late final focusNode = FocusNode(); + late final FocusNode focusNode; late final controller = ChatBottomPanelContainerController(); TextEditingController get editController; @@ -44,6 +44,8 @@ abstract class CommonPublishPageState WidgetsBinding.instance.addObserver(this); } + focusNode = FocusNode(); + initPubState(); if (widget.autofocus) { diff --git a/lib/pages/common/publish/common_text_pub_page.dart b/lib/pages/common/publish/common_text_pub_page.dart index d04412a06..8df92f18b 100644 --- a/lib/pages/common/publish/common_text_pub_page.dart +++ b/lib/pages/common/publish/common_text_pub_page.dart @@ -13,9 +13,13 @@ abstract class CommonTextPubPage extends CommonPublishPage { abstract class CommonTextPubPageState extends CommonPublishPageState { @override - late final TextEditingController editController = TextEditingController( - text: widget.initialValue, - ); + late final TextEditingController editController; + + @override + void initState() { + super.initState(); + editController = TextEditingController(text: widget.initialValue); + } @override void initPubState() { diff --git a/lib/pages/common/publish/publish_route.dart b/lib/pages/common/publish/publish_route.dart new file mode 100644 index 000000000..691b56049 --- /dev/null +++ b/lib/pages/common/publish/publish_route.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class PublishRoute extends PopupRoute { + PublishRoute({ + required RoutePageBuilder pageBuilder, + bool barrierDismissible = true, + String? barrierLabel, + Color barrierColor = const Color(0x80000000), + Duration transitionDuration = const Duration(milliseconds: 500), + RouteTransitionsBuilder? transitionBuilder, + super.settings, + }) : widget = pageBuilder, + _barrierDismissible = barrierDismissible, + _barrierLabel = barrierLabel, + _barrierColor = barrierColor, + _transitionDuration = transitionDuration, + _transitionBuilder = transitionBuilder; + + final RoutePageBuilder widget; + + @override + bool get barrierDismissible => _barrierDismissible; + final bool _barrierDismissible; + + @override + String? get barrierLabel => _barrierLabel; + final String? _barrierLabel; + + @override + Color get barrierColor => _barrierColor; + final Color _barrierColor; + + @override + Duration get transitionDuration => _transitionDuration; + final Duration _transitionDuration; + + final RouteTransitionsBuilder? _transitionBuilder; + + @override + Widget buildPage( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + ) { + return Semantics( + scopesRoute: true, + explicitChildNodes: true, + child: widget(context, animation, secondaryAnimation), + ); + } + + @override + Widget buildTransitions( + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + if (_transitionBuilder != null) { + return _transitionBuilder(context, animation, secondaryAnimation, child); + } + return SlideTransition( + position: animation.drive( + Tween( + begin: const Offset(0.0, 1.0), + end: Offset.zero, + ).chain(CurveTween(curve: Curves.linear)), + ), + child: child, + ); + } +} diff --git a/lib/pages/common/reply_controller.dart b/lib/pages/common/reply_controller.dart index a83db767a..2c8da0d13 100644 --- a/lib/pages/common/reply_controller.dart +++ b/lib/pages/common/reply_controller.dart @@ -6,6 +6,7 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/reply.dart'; import 'package:PiliPlus/models/common/reply/reply_sort_type.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; +import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/video/reply_new/view.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/reply_utils.dart'; @@ -16,7 +17,6 @@ import 'package:fixnum/fixnum.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; -import 'package:get/get_navigation/src/dialog/dialog_route.dart'; abstract class ReplyController extends CommonListController { final RxInt count = (-1).obs; @@ -146,7 +146,7 @@ abstract class ReplyController extends CommonListController { final key = oid ?? replyItem!.oid + replyItem.id; Navigator.of(context) .push( - GetDialogRoute( + PublishRoute( pageBuilder: (buildContext, animation, secondaryAnimation) { return ReplyPage( hint: hint, @@ -166,18 +166,6 @@ abstract class ReplyController extends CommonListController { }, ); }, - transitionDuration: const Duration(milliseconds: 500), - transitionBuilder: (context, animation, secondaryAnimation, child) { - return SlideTransition( - position: animation.drive( - Tween( - begin: const Offset(0.0, 1.0), - end: Offset.zero, - ).chain(CurveTween(curve: Curves.linear)), - ), - child: child, - ); - }, settings: RouteSettings( arguments: Get.arguments, name: '${Get.currentRoute}-copy-${Utils.generateRandomString(3)}', diff --git a/lib/pages/contact/view.dart b/lib/pages/contact/view.dart index 9a441e95a..4f31c8f7b 100644 --- a/lib/pages/contact/view.dart +++ b/lib/pages/contact/view.dart @@ -19,7 +19,13 @@ class ContactPage extends StatefulWidget { class _ContactPageState extends State with SingleTickerProviderStateMixin { late final mid = Accounts.main.mid; - late final _controller = TabController(length: 2, vsync: this); + late final TabController _controller; + + @override + void initState() { + super.initState(); + _controller = TabController(length: 2, vsync: this); + } @override void dispose() { diff --git a/lib/pages/download/controller.dart b/lib/pages/download/controller.dart index b1a20e169..3871f4e11 100644 --- a/lib/pages/download/controller.dart +++ b/lib/pages/download/controller.dart @@ -5,6 +5,7 @@ import 'package:PiliPlus/models_new/download/download_info.dart'; import 'package:PiliPlus/pages/common/multi_select/base.dart' show BaseMultiSelectMixin; import 'package:PiliPlus/services/download/download_service.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; diff --git a/lib/pages/download/detail/view.dart b/lib/pages/download/detail/view.dart index 2086220db..329dae9f7 100644 --- a/lib/pages/download/detail/view.dart +++ b/lib/pages/download/detail/view.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/pages/common/multi_select/base.dart' import 'package:PiliPlus/pages/download/controller.dart'; import 'package:PiliPlus/pages/download/detail/widgets/item.dart'; import 'package:PiliPlus/services/download/download_service.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:flutter/material.dart' diff --git a/lib/pages/download/view.dart b/lib/pages/download/view.dart index 2921573ea..50462d7aa 100644 --- a/lib/pages/download/view.dart +++ b/lib/pages/download/view.dart @@ -15,6 +15,7 @@ import 'package:PiliPlus/pages/download/detail/view.dart'; import 'package:PiliPlus/pages/download/detail/widgets/item.dart'; import 'package:PiliPlus/pages/download/search/view.dart'; import 'package:PiliPlus/services/download/download_service.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart' show IterableExt; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; diff --git a/lib/pages/dynamics/controller.dart b/lib/pages/dynamics/controller.dart index eba68a0a0..20e6e6375 100644 --- a/lib/pages/dynamics/controller.dart +++ b/lib/pages/dynamics/controller.dart @@ -22,11 +22,7 @@ class DynamicsController extends GetxController with GetSingleTickerProviderStateMixin, ScrollOrRefreshMixin, AccountMixin { @override final ScrollController scrollController = ScrollController(); - late final TabController tabController = TabController( - length: DynamicsTabType.values.length, - vsync: this, - initialIndex: Pref.defaultDynamicType, - ); + late final TabController tabController; late final RxInt mid = (-1).obs; late int currentMid = -1; @@ -59,6 +55,11 @@ class DynamicsController extends GetxController @override void onInit() { super.onInit(); + tabController = TabController( + length: DynamicsTabType.values.length, + vsync: this, + initialIndex: Pref.defaultDynamicType, + ); queryFollowUp(); } diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index cb7572169..ea8e7c831 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -23,7 +23,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart' hide InkWell; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class AuthorPanel extends StatelessWidget { final DynamicItemModel item; diff --git a/lib/pages/dynamics/widgets/vote.dart b/lib/pages/dynamics/widgets/vote.dart index 47b03ac05..309885597 100644 --- a/lib/pages/dynamics/widgets/vote.dart +++ b/lib/pages/dynamics/widgets/vote.dart @@ -12,10 +12,11 @@ import 'package:PiliPlus/models/dynamics/vote_model.dart'; import 'package:PiliPlus/models_new/followee_votes/vote.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/date_utils.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class VotePanel extends StatefulWidget { final VoteInfo voteInfo; diff --git a/lib/pages/dynamics_create/view.dart b/lib/pages/dynamics_create/view.dart index 0f86058da..e863221ea 100644 --- a/lib/pages/dynamics_create/view.dart +++ b/lib/pages/dynamics_create/view.dart @@ -26,13 +26,14 @@ import 'package:PiliPlus/pages/emote/view.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/request_utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart' hide DraggableScrollableSheet; import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class CreateDynPanel extends CommonRichTextPubPage { const CreateDynPanel({ diff --git a/lib/pages/dynamics_detail/view.dart b/lib/pages/dynamics_detail/view.dart index 977021e86..cd5c67e87 100644 --- a/lib/pages/dynamics_detail/view.dart +++ b/lib/pages/dynamics_detail/view.dart @@ -16,7 +16,7 @@ import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class DynamicDetailPage extends StatefulWidget { const DynamicDetailPage({super.key}); diff --git a/lib/pages/dynamics_mention/view.dart b/lib/pages/dynamics_mention/view.dart index e870ec46e..9f6ed5fcf 100644 --- a/lib/pages/dynamics_mention/view.dart +++ b/lib/pages/dynamics_mention/view.dart @@ -15,7 +15,7 @@ import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class DynMentionPanel extends StatefulWidget { const DynMentionPanel({ diff --git a/lib/pages/dynamics_select_topic/view.dart b/lib/pages/dynamics_select_topic/view.dart index fc82ab80b..606360e59 100644 --- a/lib/pages/dynamics_select_topic/view.dart +++ b/lib/pages/dynamics_select_topic/view.dart @@ -12,7 +12,7 @@ import 'package:PiliPlus/pages/search/controller.dart' show DebounceStreamState; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class SelectTopicPanel extends StatefulWidget { const SelectTopicPanel({ diff --git a/lib/pages/episode_panel/view.dart b/lib/pages/episode_panel/view.dart index eab548284..f3456f853 100644 --- a/lib/pages/episode_panel/view.dart +++ b/lib/pages/episode_panel/view.dart @@ -86,11 +86,7 @@ class EpisodePanel extends CommonSlidePage { class _EpisodePanelState extends State with TickerProviderStateMixin, CommonSlideMixin { // tab - late final TabController _tabController = TabController( - initialIndex: widget.initialTabIndex, - length: widget.list.length, - vsync: this, - )..addListener(listener); + late final TabController _tabController; late final RxInt _currentTabIndex = _tabController.index.obs; late final showTitle = widget.showTitle; @@ -154,6 +150,12 @@ class _EpisodePanelState extends State @override void initState() { super.initState(); + _tabController = TabController( + initialIndex: widget.initialTabIndex, + length: widget.list.length, + vsync: this, + )..addListener(listener); + _currentItemIndex = _findCurrentItemIndex; _itemScrollController = List.generate( widget.list.length, diff --git a/lib/pages/fav/note/view.dart b/lib/pages/fav/note/view.dart index de95d2391..c1d48051b 100644 --- a/lib/pages/fav/note/view.dart +++ b/lib/pages/fav/note/view.dart @@ -13,10 +13,16 @@ class FavNotePage extends StatefulWidget { class _FavNotePageState extends State with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { - late final TabController _tabController = TabController( - length: 2, - vsync: this, - ); + late final TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController( + length: 2, + vsync: this, + ); + } @override bool get wantKeepAlive => true; diff --git a/lib/pages/fav/pgc/view.dart b/lib/pages/fav/pgc/view.dart index 1b8dbac1a..a2175c4c8 100644 --- a/lib/pages/fav/pgc/view.dart +++ b/lib/pages/fav/pgc/view.dart @@ -15,11 +15,17 @@ class FavPgcPage extends StatefulWidget { class _FavPgcPageState extends State with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin { - late final TabController _tabController = TabController( - length: 3, - vsync: this, - initialIndex: 1, - ); + late final TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController( + length: 3, + vsync: this, + initialIndex: 1, + ); + } @override bool get wantKeepAlive => true; diff --git a/lib/pages/fav_create/view.dart b/lib/pages/fav_create/view.dart index bdb3752ec..62b0b4c34 100644 --- a/lib/pages/fav_create/view.dart +++ b/lib/pages/fav_create/view.dart @@ -27,8 +27,8 @@ class CreateFavPage extends StatefulWidget { class _CreateFavPageState extends State { dynamic _mediaId; - late final _titleController = TextEditingController(); - late final _introController = TextEditingController(); + late final TextEditingController _titleController; + late final TextEditingController _introController; String? _cover; bool _isPublic = true; late final _imagePicker = ImagePicker(); @@ -38,6 +38,8 @@ class _CreateFavPageState extends State { @override void initState() { super.initState(); + _titleController = TextEditingController(); + _introController = TextEditingController(); _mediaId = Get.parameters['mediaId']; if (_mediaId != null) { _getFolderInfo(); diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index 286e76120..4582f3b69 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -10,7 +10,7 @@ import 'package:PiliPlus/utils/extension/get_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; class HomePage extends StatefulWidget { diff --git a/lib/pages/later/view.dart b/lib/pages/later/view.dart index 84b384d80..edbdf4ad6 100644 --- a/lib/pages/later/view.dart +++ b/lib/pages/later/view.dart @@ -25,10 +25,7 @@ class LaterPage extends StatefulWidget { class _LaterPageState extends State with SingleTickerProviderStateMixin { final LaterBaseController _baseCtr = Get.put(LaterBaseController()); - late final TabController _tabController = TabController( - length: LaterViewType.values.length, - vsync: this, - ); + late final TabController _tabController; LaterController currCtr([int? index]) { final type = LaterViewType.values[index ?? _tabController.index]; @@ -46,7 +43,10 @@ class _LaterPageState extends State @override void initState() { super.initState(); - _tabController.addListener(listener); + _tabController = TabController( + length: LaterViewType.values.length, + vsync: this, + )..addListener(listener); } @override diff --git a/lib/pages/live_dm_block/controller.dart b/lib/pages/live_dm_block/controller.dart index 158701b33..2d5b1bfe2 100644 --- a/lib/pages/live_dm_block/controller.dart +++ b/lib/pages/live_dm_block/controller.dart @@ -12,13 +12,11 @@ class LiveDmBlockController extends GetxController @override void onInit() { super.onInit(); + tabController = TabController(length: 2, vsync: this); queryData(); } - late final TabController tabController = TabController( - length: 2, - vsync: this, - ); + late final TabController tabController; int? oldLevel; final RxInt level = 0.obs; diff --git a/lib/pages/live_dm_block/view.dart b/lib/pages/live_dm_block/view.dart index 7f07d401a..aadf28e37 100644 --- a/lib/pages/live_dm_block/view.dart +++ b/lib/pages/live_dm_block/view.dart @@ -12,7 +12,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class LiveDmBlockPage extends StatefulWidget { const LiveDmBlockPage({super.key}); diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 802a821ab..45249ec26 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -13,6 +13,7 @@ import 'package:PiliPlus/models_new/live/live_dm_info/data.dart'; import 'package:PiliPlus/models_new/live/live_room_info_h5/data.dart'; import 'package:PiliPlus/models_new/live/live_room_play_info/codec.dart'; import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; +import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/danmaku/danmaku_model.dart'; import 'package:PiliPlus/pages/live_room/send_danmaku/view.dart'; import 'package:PiliPlus/pages/video/widgets/header_control.dart'; @@ -96,8 +97,7 @@ class LiveRoomController extends GetxController { late final RxList superChatMsg = [].obs; RxBool disableAutoScroll = false.obs; LiveMessageStream? _msgStream; - late final ScrollController scrollController = ScrollController() - ..addListener(listener); + late final ScrollController scrollController; late final RxInt pageIndex = 0.obs; PageController? pageController; @@ -152,6 +152,7 @@ class LiveRoomController extends GetxController { @override void onInit() { super.onInit(); + scrollController = ScrollController()..addListener(listener); final account = Accounts.heartbeat; isLogin = account.isLogin; mid = account.mid; @@ -246,8 +247,9 @@ class LiveRoomController extends GetxController { } void _showDialog(String title) { - Get.dialog( - AlertDialog( + showDialog( + context: Get.context!, + builder: (_) => AlertDialog( title: Text(title), actions: [ TextButton( @@ -523,38 +525,28 @@ class LiveRoomController extends GetxController { SmartDialog.showToast('账号未登录'); return; } - Get.generalDialog( - barrierLabel: '', - barrierDismissible: true, - pageBuilder: (context, animation, secondaryAnimation) { - return LiveSendDmPanel( - fromEmote: fromEmote, - liveRoomController: this, - items: savedDanmaku, - autofocus: !fromEmote, - onSave: (msg) { - if (msg.isEmpty) { - savedDanmaku?.clear(); - savedDanmaku = null; - } else { - savedDanmaku = msg.toList(); - } - }, - ); - }, - transitionDuration: fromEmote - ? const Duration(milliseconds: 400) - : const Duration(milliseconds: 500), - transitionBuilder: (context, animation, secondaryAnimation, child) { - var tween = Tween( - begin: const Offset(0.0, 1.0), - end: Offset.zero, - ).chain(CurveTween(curve: Curves.linear)); - return SlideTransition( - position: animation.drive(tween), - child: child, - ); - }, + Get.key.currentState!.push( + PublishRoute( + pageBuilder: (context, animation, secondaryAnimation) { + return LiveSendDmPanel( + fromEmote: fromEmote, + liveRoomController: this, + items: savedDanmaku, + autofocus: !fromEmote, + onSave: (msg) { + if (msg.isEmpty) { + savedDanmaku?.clear(); + savedDanmaku = null; + } else { + savedDanmaku = msg.toList(); + } + }, + ); + }, + transitionDuration: fromEmote + ? const Duration(milliseconds: 400) + : const Duration(milliseconds: 500), + ), ); } } diff --git a/lib/pages/live_room/send_danmaku/view.dart b/lib/pages/live_room/send_danmaku/view.dart index 3b8126416..4938717b2 100644 --- a/lib/pages/live_room/send_danmaku/view.dart +++ b/lib/pages/live_room/send_danmaku/view.dart @@ -10,7 +10,7 @@ import 'package:PiliPlus/pages/live_emote/view.dart'; import 'package:PiliPlus/pages/live_room/controller.dart'; import 'package:flutter/material.dart' hide TextField; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide MultipartFile; +import 'package:get/get.dart'; class LiveSendDmPanel extends CommonRichTextPubPage { final bool fromEmote; diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index a03d5bedb..d620ae4f2 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -37,7 +37,7 @@ import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:screen_brightness_platform_interface/screen_brightness_platform_interface.dart'; class LiveRoomPage extends StatefulWidget { diff --git a/lib/pages/live_search/controller.dart b/lib/pages/live_search/controller.dart index 3b33ffaec..e9400e331 100644 --- a/lib/pages/live_search/controller.dart +++ b/lib/pages/live_search/controller.dart @@ -9,7 +9,7 @@ import 'package:get/get.dart'; class LiveSearchController extends GetxController with GetSingleTickerProviderStateMixin { - late final tabController = TabController(vsync: this, length: 2); + late final TabController tabController; final editingController = TextEditingController(); final focusNode = FocusNode(); @@ -28,6 +28,12 @@ class LiveSearchController extends GetxController tag: Utils.generateRandomString(8), ); + @override + void onInit() { + super.onInit(); + tabController = TabController(vsync: this, length: 2); + } + void onClear() { if (editingController.value.text.isNotEmpty) { editingController.clear(); diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index 3e52fcf89..a748c14c6 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -137,8 +137,9 @@ class LoginPageController extends GetxController } if (PlatformUtils.isDesktop) { - Get.dialog>( - GeetestWebviewDialog(geeGt, geeChallenge), + showDialog>( + context: Get.context!, + builder: (context) => GeetestWebviewDialog(geeGt, geeChallenge), ).then((res) { if (res != null) { updateCaptchaData(res); @@ -341,8 +342,9 @@ class LoginPageController extends GetxController TextEditingController textFieldController = TextEditingController(); String captchaKey = ''; - Get.dialog( - AlertDialog( + showDialog( + context: Get.context!, + builder: (context) => AlertDialog( titlePadding: const EdgeInsets.only( left: 16, top: 18, diff --git a/lib/pages/login/view.dart b/lib/pages/login/view.dart index 738c8612c..e043633f8 100644 --- a/lib/pages/login/view.dart +++ b/lib/pages/login/view.dart @@ -17,7 +17,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:pretty_qr_code/pretty_qr_code.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 96b5ef634..5bdc1939b 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -22,7 +22,7 @@ import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/pages/main_reply/controller.dart b/lib/pages/main_reply/controller.dart index 83c0c3cfc..7e706cb6f 100644 --- a/lib/pages/main_reply/controller.dart +++ b/lib/pages/main_reply/controller.dart @@ -16,9 +16,26 @@ class MainReplyController extends ReplyController bool _showFab = true; + late final AnimationController _fabAnimationCtr; + late final CurvedAnimation _curvedAnimation; + late final Animation fabAnim; + @override void onInit() { super.onInit(); + _fabAnimationCtr = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 300), + )..forward(); + _curvedAnimation = CurvedAnimation( + parent: _fabAnimationCtr, + curve: Curves.easeInOut, + ); + fabAnim = Tween( + begin: const Offset(0, 2), + end: Offset.zero, + ).animate(_curvedAnimation); + final args = Get.arguments; oid = args['oid']; replyType = args['replyType']; @@ -52,18 +69,9 @@ class MainReplyController extends ReplyController @override List? getDataList(MainListReply response) => response.replies; - late final AnimationController _fabAnimationCtr = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 300), - )..forward(); - - late final Animation fabAnim = Tween( - begin: const Offset(0, 2), - end: Offset.zero, - ).animate(CurvedAnimation(parent: _fabAnimationCtr, curve: Curves.easeInOut)); - @override void onClose() { + _curvedAnimation.dispose(); _fabAnimationCtr.dispose(); super.onClose(); } diff --git a/lib/pages/member/widget/user_info_card.dart b/lib/pages/member/widget/user_info_card.dart index 9861c1d39..da04591a8 100644 --- a/lib/pages/member/widget/user_info_card.dart +++ b/lib/pages/member/widget/user_info_card.dart @@ -23,7 +23,7 @@ import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class UserInfoCard extends StatelessWidget { const UserInfoCard({ diff --git a/lib/pages/member_home/view.dart b/lib/pages/member_home/view.dart index 39a2ceda1..4e30d1efe 100644 --- a/lib/pages/member_home/view.dart +++ b/lib/pages/member_home/view.dart @@ -20,7 +20,7 @@ import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class MemberHome extends StatefulWidget { const MemberHome({super.key, this.heroTag}); diff --git a/lib/pages/member_opus/controller.dart b/lib/pages/member_opus/controller.dart index 6f82172a0..46d42f117 100644 --- a/lib/pages/member_opus/controller.dart +++ b/lib/pages/member_opus/controller.dart @@ -5,6 +5,7 @@ import 'package:PiliPlus/models_new/space/space_opus/data.dart'; import 'package:PiliPlus/models_new/space/space_opus/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:PiliPlus/pages/member/controller.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:get/get.dart'; class MemberOpusController diff --git a/lib/pages/member_profile/view.dart b/lib/pages/member_profile/view.dart index 8174722b1..ff07f086c 100644 --- a/lib/pages/member_profile/view.dart +++ b/lib/pages/member_profile/view.dart @@ -28,7 +28,7 @@ import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide FormData, MultipartFile; +import 'package:get/get.dart'; import 'package:image_cropper/image_cropper.dart'; import 'package:image_picker/image_picker.dart'; import 'package:mime/mime.dart'; @@ -43,13 +43,14 @@ class EditProfilePage extends StatefulWidget { class _EditProfilePageState extends State { LoadingState _loadingState = LoadingState.loading(); - late final _textController = TextEditingController(); + late final TextEditingController _textController; late final _imagePicker = ImagePicker(); AccountService accountService = Get.find(); @override void initState() { super.initState(); + _textController = TextEditingController(); _getInfo(); } diff --git a/lib/pages/member_search/controller.dart b/lib/pages/member_search/controller.dart index 5e68095fd..91a323dd6 100644 --- a/lib/pages/member_search/controller.dart +++ b/lib/pages/member_search/controller.dart @@ -7,9 +7,9 @@ import 'package:get/get.dart'; class MemberSearchController extends GetxController with GetSingleTickerProviderStateMixin { - late final tabController = TabController(vsync: this, length: 2); - final editingController = TextEditingController(); - final focusNode = FocusNode(); + late final FocusNode focusNode; + late final TabController tabController; + late final TextEditingController editingController; final mid = Get.parameters['mid']!; final uname = Get.parameters['uname']; @@ -17,14 +17,24 @@ class MemberSearchController extends GetxController final RxBool hasData = false.obs; final RxList counts = [-1, -1].obs; - late final arcCtr = Get.put( - MemberSearchChildController(this, MemberSearchType.archive), - tag: Utils.generateRandomString(8), - ); - late final dynCtr = Get.put( - MemberSearchChildController(this, MemberSearchType.dynamic), - tag: Utils.generateRandomString(8), - ); + late final MemberSearchChildController arcCtr; + late final MemberSearchChildController dynCtr; + + @override + void onInit() { + super.onInit(); + focusNode = FocusNode(); + editingController = TextEditingController(); + tabController = TabController(vsync: this, length: 2); + arcCtr = Get.put( + MemberSearchChildController(this, MemberSearchType.archive), + tag: Utils.generateRandomString(8), + ); + dynCtr = Get.put( + MemberSearchChildController(this, MemberSearchType.dynamic), + tag: Utils.generateRandomString(8), + ); + } void onClear() { if (editingController.value.text.isNotEmpty) { @@ -51,9 +61,9 @@ class MemberSearchController extends GetxController @override void onClose() { - editingController.dispose(); focusNode.dispose(); tabController.dispose(); + editingController.dispose(); super.onClose(); } } diff --git a/lib/pages/music/view.dart b/lib/pages/music/view.dart index 9dc379659..3744a6173 100644 --- a/lib/pages/music/view.dart +++ b/lib/pages/music/view.dart @@ -29,7 +29,7 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class MusicDetailPage extends StatefulWidget { const MusicDetailPage({super.key}); diff --git a/lib/pages/pgc_review/post/view.dart b/lib/pages/pgc_review/post/view.dart index dbefb79c4..0a420315d 100644 --- a/lib/pages/pgc_review/post/view.dart +++ b/lib/pages/pgc_review/post/view.dart @@ -27,12 +27,18 @@ class PgcReviewPostPanel extends StatefulWidget { } class _PgcReviewPostPanelState extends State { - late final _controller = TextEditingController(text: widget.content); + late final TextEditingController _controller; late final RxInt _score = (widget.score ?? 0).obs; late final RxBool _shareFeed = false.obs; late final RxBool _enablePost = _isMod.obs; late final _isMod = widget.reviewId != null; + @override + void initState() { + super.initState(); + _controller = TextEditingController(text: widget.content); + } + @override void dispose() { _controller.dispose(); diff --git a/lib/pages/pgc_review/view.dart b/lib/pages/pgc_review/view.dart index aba240295..1b3446a34 100644 --- a/lib/pages/pgc_review/view.dart +++ b/lib/pages/pgc_review/view.dart @@ -23,10 +23,16 @@ class PgcReviewPage extends StatefulWidget { class _PgcReviewPageState extends State with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { - late final _tabController = TabController( - length: PgcReviewType.values.length, - vsync: this, - ); + late final TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController( + length: PgcReviewType.values.length, + vsync: this, + ); + } @override void dispose() { diff --git a/lib/pages/save_panel/view.dart b/lib/pages/save_panel/view.dart index fb9f76c50..3a537440b 100644 --- a/lib/pages/save_panel/view.dart +++ b/lib/pages/save_panel/view.dart @@ -8,6 +8,7 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' show ReplyInfo; import 'package:PiliPlus/models/common/video/video_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; +import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/music/controller.dart'; import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart'; @@ -23,7 +24,7 @@ import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:intl/intl.dart' show DateFormat; import 'package:pretty_qr_code/pretty_qr_code.dart'; import 'package:share_plus/share_plus.dart'; @@ -43,25 +44,25 @@ class SavePanel extends StatefulWidget { State createState() => _SavePanelState(); static void toSavePanel({dynamic upMid, dynamic item}) { - Get.generalDialog( - barrierLabel: '', - barrierDismissible: true, - pageBuilder: (context, animation, secondaryAnimation) { - return SavePanel(upMid: upMid, item: item); - }, - transitionDuration: const Duration(milliseconds: 255), - transitionBuilder: (context, animation, secondaryAnimation, child) { - return FadeTransition( - opacity: animation.drive( - Tween( - begin: 0, - end: 1, - ).chain(CurveTween(curve: Curves.easeInOut)), - ), - child: child, - ); - }, - routeSettings: RouteSettings(arguments: Get.arguments), + Get.key.currentState!.push( + PublishRoute( + pageBuilder: (context, animation, secondaryAnimation) { + return SavePanel(upMid: upMid, item: item); + }, + transitionDuration: const Duration(milliseconds: 255), + transitionBuilder: (context, animation, secondaryAnimation, child) { + return FadeTransition( + opacity: animation.drive( + Tween( + begin: 0, + end: 1, + ).chain(CurveTween(curve: Curves.easeInOut)), + ), + child: child, + ); + }, + settings: RouteSettings(arguments: Get.arguments), + ), ); } } diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index 77821ce54..25204c2ae 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -14,7 +14,7 @@ import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class SearchPage extends StatefulWidget { const SearchPage({super.key}); diff --git a/lib/pages/search_panel/article/controller.dart b/lib/pages/search_panel/article/controller.dart index 57969dd6c..105647cfc 100644 --- a/lib/pages/search_panel/article/controller.dart +++ b/lib/pages/search_panel/article/controller.dart @@ -6,7 +6,7 @@ import 'package:PiliPlus/pages/search/widgets/search_text.dart'; import 'package:PiliPlus/pages/search_panel/controller.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class SearchArticleController extends SearchPanelController { diff --git a/lib/pages/search_panel/user/controller.dart b/lib/pages/search_panel/user/controller.dart index b80079bda..444aeeeea 100644 --- a/lib/pages/search_panel/user/controller.dart +++ b/lib/pages/search_panel/user/controller.dart @@ -6,7 +6,7 @@ import 'package:PiliPlus/pages/search/widgets/search_text.dart'; import 'package:PiliPlus/pages/search_panel/controller.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class SearchUserController extends SearchPanelController { diff --git a/lib/pages/search_panel/video/controller.dart b/lib/pages/search_panel/video/controller.dart index 60a256938..7217b222c 100644 --- a/lib/pages/search_panel/video/controller.dart +++ b/lib/pages/search_panel/video/controller.dart @@ -12,7 +12,7 @@ import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class SearchVideoController extends SearchPanelController { diff --git a/lib/pages/search_trending/view.dart b/lib/pages/search_trending/view.dart index 89c1a03c9..923e6bb75 100644 --- a/lib/pages/search_trending/view.dart +++ b/lib/pages/search_trending/view.dart @@ -15,7 +15,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide ListTile; import 'package:flutter/services.dart' show SystemUiOverlayStyle; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class SearchTrendingPage extends StatefulWidget { const SearchTrendingPage({super.key}); diff --git a/lib/pages/setting/models/extra_settings.dart b/lib/pages/setting/models/extra_settings.dart index 979d8bc31..9ac85f158 100644 --- a/lib/pages/setting/models/extra_settings.dart +++ b/lib/pages/setting/models/extra_settings.dart @@ -27,6 +27,7 @@ import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/services/download/download_service.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/cache_manager.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/path_utils.dart'; @@ -795,8 +796,10 @@ List get extraSettings => [ return; } final quickFavId = Pref.quickFavId; - Get.dialog( - AlertDialog( + if (!context.mounted) return; + showDialog( + context: context, + builder: (context) => AlertDialog( clipBehavior: Clip.hardEdge, title: const Text('选择默认收藏夹'), contentPadding: const EdgeInsets.only(top: 5, bottom: 18), diff --git a/lib/pages/setting/models/style_settings.dart b/lib/pages/setting/models/style_settings.dart index ca132a938..efb5473ec 100644 --- a/lib/pages/setting/models/style_settings.dart +++ b/lib/pages/setting/models/style_settings.dart @@ -25,6 +25,7 @@ import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart'; import 'package:PiliPlus/pages/setting/widgets/slide_dialog.dart'; import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; import 'package:PiliPlus/utils/extension/get_ext.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; diff --git a/lib/pages/setting/pages/display_mode.dart b/lib/pages/setting/pages/display_mode.dart index ed2e23f2c..5847492b0 100644 --- a/lib/pages/setting/pages/display_mode.dart +++ b/lib/pages/setting/pages/display_mode.dart @@ -1,10 +1,10 @@ +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show PlatformException; import 'package:flutter_displaymode/flutter_displaymode.dart'; -import 'package:get/get.dart'; import 'package:hive/hive.dart'; class SetDisplayMode extends StatefulWidget { diff --git a/lib/pages/setting/pages/font_size_select.dart b/lib/pages/setting/pages/font_size_select.dart index 5db6d00f0..a24456f67 100644 --- a/lib/pages/setting/pages/font_size_select.dart +++ b/lib/pages/setting/pages/font_size_select.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/common/widgets/view_safe_area.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; diff --git a/lib/pages/setting/pages/play_speed_set.dart b/lib/pages/setting/pages/play_speed_set.dart index 0c3cf2b30..78b5fb50b 100644 --- a/lib/pages/setting/pages/play_speed_set.dart +++ b/lib/pages/setting/pages/play_speed_set.dart @@ -10,7 +10,7 @@ import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter/material.dart' hide ListTile; import 'package:flutter/services.dart' show FilteringTextInputFormatter; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:hive/hive.dart'; class PlaySpeedPage extends StatefulWidget { diff --git a/lib/pages/setting/view.dart b/lib/pages/setting/view.dart index 8ae174198..b9be692aa 100644 --- a/lib/pages/setting/view.dart +++ b/lib/pages/setting/view.dart @@ -17,7 +17,7 @@ import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:flutter/material.dart' hide ListTile; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; class _SettingsModel { diff --git a/lib/pages/setting/widgets/dual_slide_dialog.dart b/lib/pages/setting/widgets/dual_slide_dialog.dart index 700edfa03..7543898e5 100644 --- a/lib/pages/setting/widgets/dual_slide_dialog.dart +++ b/lib/pages/setting/widgets/dual_slide_dialog.dart @@ -1,5 +1,5 @@ +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:flutter/material.dart'; -import 'package:get/get_utils/get_utils.dart'; class DualSlideDialog extends StatefulWidget { final double value1; diff --git a/lib/pages/setting/widgets/slide_dialog.dart b/lib/pages/setting/widgets/slide_dialog.dart index 8407df0d2..38e04e134 100644 --- a/lib/pages/setting/widgets/slide_dialog.dart +++ b/lib/pages/setting/widgets/slide_dialog.dart @@ -1,5 +1,5 @@ +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:flutter/material.dart'; -import 'package:get/get_utils/get_utils.dart'; class SlideDialog extends StatefulWidget { final double value; diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index c289a33e9..ab19d455f 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -40,6 +40,7 @@ import 'package:PiliPlus/models_new/video/video_pbp/data.dart'; import 'package:PiliPlus/models_new/video/video_play_info/subtitle.dart'; import 'package:PiliPlus/models_new/video/video_stein_edgeinfo/data.dart'; import 'package:PiliPlus/pages/audio/view.dart'; +import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/search/widgets/search_text.dart'; import 'package:PiliPlus/pages/video/download_panel/view.dart'; import 'package:PiliPlus/pages/video/introduction/pgc/controller.dart'; @@ -58,6 +59,7 @@ import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; @@ -71,8 +73,7 @@ import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_volume_controller/flutter_volume_controller.dart'; -import 'package:get/get.dart' hide ContextExtensionss; -import 'package:get/get_navigation/src/dialog/dialog_route.dart'; +import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:media_kit/media_kit.dart'; @@ -165,8 +166,9 @@ class VideoDetailController extends GetxController late final scrollKey = GlobalKey(); late final RxBool isVertical = false.obs; late final RxDouble scrollRatio = 0.0.obs; - late final ScrollController scrollCtr = ScrollController() - ..addListener(scrollListener); + ScrollController? _scrollCtr; + ScrollController get scrollCtr => + _scrollCtr ??= ScrollController()..addListener(scrollListener); late bool isExpanding = false; late bool isCollapsing = false; AnimationController? animController; @@ -216,9 +218,7 @@ class VideoDetailController extends GetxController } else { // current maxVideoHeight final currentHeight = (maxVideoHeight - scrollCtr.offset) - .toPrecision( - 2, - ); + .toPrecision(2); double minVideoHeightPrecise = minVideoHeight.toPrecision(2); if (currentHeight == minVideoHeightPrecise) { isExpanding = true; @@ -1029,7 +1029,7 @@ class VideoDetailController extends GetxController await plPlayerController.pause(); } await Get.key.currentState!.push( - GetDialogRoute( + PublishRoute( pageBuilder: (buildContext, animation, secondaryAnimation) { return SendDanmakuPanel( cid: cid.value, @@ -1046,18 +1046,6 @@ class VideoDetailController extends GetxController onSaveDmConfig: (dmConfig) => this.dmConfig = dmConfig, ); }, - transitionDuration: const Duration(milliseconds: 500), - transitionBuilder: (context, animation, secondaryAnimation, child) { - return SlideTransition( - position: animation.drive( - Tween( - begin: const Offset(0.0, 1.0), - end: Offset.zero, - ).chain(CurveTween(curve: Curves.linear)), - ), - child: child, - ); - }, ), ); if (isPlaying) { @@ -1667,8 +1655,8 @@ class VideoDetailController extends GetxController introScrollCtr?.dispose(); introScrollCtr = null; tabCtr.dispose(); - scrollCtr - ..removeListener(scrollListener) + _scrollCtr + ?..removeListener(scrollListener) ..dispose(); animController?.dispose(); super.onClose(); diff --git a/lib/pages/video/introduction/pgc/controller.dart b/lib/pages/video/introduction/pgc/controller.dart index c25b98a97..13d409f7d 100644 --- a/lib/pages/video/introduction/pgc/controller.dart +++ b/lib/pages/video/introduction/pgc/controller.dart @@ -20,6 +20,7 @@ import 'package:PiliPlus/pages/video/pay_coins/view.dart'; import 'package:PiliPlus/pages/video/reply/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/services/service_locator.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/id_utils.dart'; diff --git a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart index 14e95f8fd..1b5cd9368 100644 --- a/lib/pages/video/introduction/pgc/widgets/intro_detail.dart +++ b/lib/pages/video/introduction/pgc/widgets/intro_detail.dart @@ -31,8 +31,15 @@ class PgcIntroPanel extends CommonSlidePage { class _IntroDetailState extends State with TickerProviderStateMixin, CommonSlideMixin { - late final _tabController = TabController(length: 2, vsync: this); - final _controller = ScrollController(); + late final ScrollController _controller; + late final TabController _tabController; + + @override + void initState() { + super.initState(); + _controller = ScrollController(); + _tabController = TabController(length: 2, vsync: this); + } @override void dispose() { diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index 078e30cf8..21e4b2d43 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -28,6 +28,7 @@ import 'package:PiliPlus/pages/video/reply/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; diff --git a/lib/pages/video/introduction/ugc/view.dart b/lib/pages/video/introduction/ugc/view.dart index adc48bf9c..0ed87bf6c 100644 --- a/lib/pages/video/introduction/ugc/view.dart +++ b/lib/pages/video/introduction/ugc/view.dart @@ -37,7 +37,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; class UgcIntroPanel extends StatefulWidget { diff --git a/lib/pages/video/introduction/ugc/widgets/triple_mixin.dart b/lib/pages/video/introduction/ugc/widgets/triple_mixin.dart index d56cf9eef..737662105 100644 --- a/lib/pages/video/introduction/ugc/widgets/triple_mixin.dart +++ b/lib/pages/video/introduction/ugc/widgets/triple_mixin.dart @@ -24,6 +24,7 @@ mixin TripleMixin on GetxController, TickerProvider { // no need for pugv AnimationController? _tripleAnimCtr; + CurvedAnimation? _curvedAnimation; Animation? _tripleAnimation; AnimationController get tripleAnimCtr => @@ -33,10 +34,15 @@ mixin TripleMixin on GetxController, TickerProvider { reverseDuration: const Duration(milliseconds: 400), ); + CurvedAnimation get curvedAnimation => _curvedAnimation ??= CurvedAnimation( + parent: tripleAnimCtr, + curve: Curves.easeInOut, + ); + Animation get tripleAnimation => _tripleAnimation ??= Tween( begin: 0, end: -2 * pi, - ).animate(CurvedAnimation(parent: tripleAnimCtr, curve: Curves.easeInOut)); + ).animate(curvedAnimation); Timer? _timer; @@ -78,6 +84,7 @@ mixin TripleMixin on GetxController, TickerProvider { @override void onClose() { _cancelTimer(); + _curvedAnimation?.dispose(); _tripleAnimCtr?.dispose(); super.onClose(); } diff --git a/lib/pages/video/pay_coins/view.dart b/lib/pages/video/pay_coins/view.dart index 9157d879e..24ed1f6cb 100644 --- a/lib/pages/video/pay_coins/view.dart +++ b/lib/pages/video/pay_coins/view.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'dart:math' as math; import 'dart:math' show max; +import 'package:PiliPlus/pages/common/publish/publish_route.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/widget_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; @@ -9,8 +11,7 @@ import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; -import 'package:get/get_navigation/src/dialog/dialog_route.dart'; +import 'package:get/get.dart'; class PayCoinsPage extends StatefulWidget { const PayCoinsPage({ @@ -33,7 +34,7 @@ class PayCoinsPage extends StatefulWidget { bool hasCoin = false, }) { Get.key.currentState!.push( - GetDialogRoute( + PublishRoute( pageBuilder: (buildContext, animation, secondaryAnimation) { return PayCoinsPage( onPayCoin: onPayCoin, diff --git a/lib/pages/video/post_panel/view.dart b/lib/pages/video/post_panel/view.dart index cfe7a90de..7151a0936 100644 --- a/lib/pages/video/post_panel/view.dart +++ b/lib/pages/video/post_panel/view.dart @@ -18,7 +18,7 @@ import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show FilteringTextInputFormatter; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide Response; +import 'package:get/get.dart'; class PostPanel extends CommonSlidePage { const PostPanel({ diff --git a/lib/pages/video/reply/controller.dart b/lib/pages/video/reply/controller.dart index 2eb19e3cd..1e65cacad 100644 --- a/lib/pages/video/reply/controller.dart +++ b/lib/pages/video/reply/controller.dart @@ -27,33 +27,38 @@ class VideoReplyController extends ReplyController dynamic get sourceId => IdUtils.av2bv(aid); bool _isFabVisible = true; - late final AnimationController fabAnimationCtr = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 100), - )..forward(); + late final AnimationController _fabAnimationCtr; + late final CurvedAnimation _curvedAnimation; + late final Animation animation; - late final anim = - Tween( - begin: const Offset(0, 2), - end: Offset.zero, - ).animate( - CurvedAnimation( - parent: fabAnimationCtr, - curve: Curves.easeInOut, - ), - ); + @override + void onInit() { + super.onInit(); + _fabAnimationCtr = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 100), + )..forward(); + _curvedAnimation = CurvedAnimation( + parent: _fabAnimationCtr, + curve: Curves.easeInOut, + ); + animation = Tween( + begin: const Offset(0, 2), + end: Offset.zero, + ).animate(_curvedAnimation); + } void showFab() { if (!_isFabVisible) { _isFabVisible = true; - fabAnimationCtr.forward(); + _fabAnimationCtr.forward(); } } void hideFab() { if (_isFabVisible) { _isFabVisible = false; - fabAnimationCtr.reverse(); + _fabAnimationCtr.reverse(); } } @@ -73,7 +78,8 @@ class VideoReplyController extends ReplyController @override void onClose() { - fabAnimationCtr.dispose(); + _curvedAnimation.dispose(); + _fabAnimationCtr.dispose(); super.onClose(); } } diff --git a/lib/pages/video/reply/view.dart b/lib/pages/video/reply/view.dart index d9c4b37c7..b7d564ef9 100644 --- a/lib/pages/video/reply/view.dart +++ b/lib/pages/video/reply/view.dart @@ -142,7 +142,7 @@ class _VideoReplyPanelState extends State right: kFloatingActionButtonMargin, bottom: kFloatingActionButtonMargin + bottom, child: SlideTransition( - position: _videoReplyController.anim, + position: _videoReplyController.animation, child: FloatingActionButton( heroTag: null, onPressed: () { diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index a3d63ed5b..e57cb04d1 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -36,7 +36,7 @@ import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class ReplyItemGrpc extends StatelessWidget { const ReplyItemGrpc({ diff --git a/lib/pages/video/reply_new/view.dart b/lib/pages/video/reply_new/view.dart index b83885604..c97114e17 100644 --- a/lib/pages/video/reply_new/view.dart +++ b/lib/pages/video/reply_new/view.dart @@ -25,7 +25,7 @@ import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide TextField; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; class ReplyPage extends CommonRichTextPubPage { final int oid; diff --git a/lib/pages/video/reply_reply/controller.dart b/lib/pages/video/reply_reply/controller.dart index 9a93abb49..5b33c19e1 100644 --- a/lib/pages/video/reply_reply/controller.dart +++ b/lib/pages/video/reply_reply/controller.dart @@ -2,6 +2,7 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' show ReplyInfo, DetailListReply, Mode; import 'package:PiliPlus/grpc/reply.dart'; import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/common/reply_controller.dart'; import 'package:PiliPlus/pages/video/reply_new/view.dart'; import 'package:PiliPlus/utils/id_utils.dart'; @@ -12,7 +13,6 @@ import 'package:fixnum/fixnum.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:get/get.dart'; -import 'package:get/get_navigation/src/dialog/dialog_route.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; class VideoReplyReplyController extends ReplyController @@ -175,7 +175,7 @@ class VideoReplyReplyController extends ReplyController Navigator.of(context) .push( - GetDialogRoute( + PublishRoute( pageBuilder: (buildContext, animation, secondaryAnimation) { return ReplyPage( hint: hint, @@ -194,18 +194,6 @@ class VideoReplyReplyController extends ReplyController }, ); }, - transitionDuration: const Duration(milliseconds: 500), - transitionBuilder: (context, animation, secondaryAnimation, child) { - return SlideTransition( - position: animation.drive( - Tween( - begin: const Offset(0.0, 1.0), - end: Offset.zero, - ).chain(CurveTween(curve: Curves.linear)), - ), - child: child, - ); - }, ), ) .then((res) { diff --git a/lib/pages/video/reply_reply/view.dart b/lib/pages/video/reply_reply/view.dart index 35a826494..43bf29793 100644 --- a/lib/pages/video/reply_reply/view.dart +++ b/lib/pages/video/reply_reply/view.dart @@ -16,7 +16,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; class VideoReplyReplyPanel extends CommonSlidePage { @@ -94,13 +94,15 @@ class _VideoReplyReplyPanelState extends State with SingleTickerProviderStateMixin, CommonSlideMixin { late VideoReplyReplyController _controller; late final _tag = Utils.makeHeroTag('${widget.rpid}${widget.dialog}'); - Animation? colorAnimation; + CurvedAnimation? _curvedAnimation; + Animation? _colorAnimation; late final bool isDialogue = widget.dialog != null; @override void didChangeDependencies() { super.didChangeDependencies(); + _colorAnimation = null; final controller = PrimaryScrollController.of(context); _controller ..didChangeDependencies(context) @@ -127,6 +129,7 @@ class _VideoReplyReplyPanelState extends State @override void dispose() { + _curvedAnimation?.dispose(); Get.delete(tag: _tag); super.dispose(); } @@ -331,12 +334,12 @@ class _VideoReplyReplyPanelState extends State final child = _replyItem(context, response[index], index); if (jumpIndex == index) { return AnimatedBuilder( - animation: colorAnimation ??= + animation: _colorAnimation ??= ColorTween( begin: theme.colorScheme.onInverseSurface, end: theme.colorScheme.surface, ).animate( - CurvedAnimation( + _curvedAnimation ??= CurvedAnimation( parent: _controller.animController, curve: const Interval(0.8, 1.0), // 前0.8s不变, 后0.2s开始动画 ), @@ -344,7 +347,7 @@ class _VideoReplyReplyPanelState extends State child: child, builder: (context, child) { return ColoredBox( - color: colorAnimation!.value!, + color: _colorAnimation!.value!, child: child, ); }, diff --git a/lib/pages/video/reply_search_item/controller.dart b/lib/pages/video/reply_search_item/controller.dart index dbc49df17..e2f341514 100644 --- a/lib/pages/video/reply_search_item/controller.dart +++ b/lib/pages/video/reply_search_item/controller.dart @@ -11,9 +11,9 @@ class ReplySearchController extends GetxController final int type; final int oid; - late final tabController = TabController(vsync: this, length: 2); - final editingController = TextEditingController(); - final focusNode = FocusNode(); + late final FocusNode focusNode; + late final TabController tabController; + late final TextEditingController editingController; late final videoCtr = Get.put( ReplySearchChildController(this, ReplySearchType.video), @@ -36,6 +36,9 @@ class ReplySearchController extends GetxController @override void onInit() { super.onInit(); + focusNode = FocusNode(); + tabController = TabController(vsync: this, length: 2); + editingController = TextEditingController(); submit(); } @@ -50,9 +53,9 @@ class ReplySearchController extends GetxController @override void onClose() { - editingController.dispose(); focusNode.dispose(); tabController.dispose(); + editingController.dispose(); super.onClose(); } } diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 527ee074d..9e0816942 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -64,7 +64,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show SystemUiOverlayStyle; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:screen_brightness_platform_interface/screen_brightness_platform_interface.dart'; class VideoDetailPageV extends StatefulWidget { diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index ff1778888..0890d94c0 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -38,6 +38,8 @@ import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; diff --git a/lib/pages/webdav/webdav.dart b/lib/pages/webdav/webdav.dart index c18bb32a5..c9bc1eed9 100644 --- a/lib/pages/webdav/webdav.dart +++ b/lib/pages/webdav/webdav.dart @@ -7,7 +7,7 @@ import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:webdav_client/webdav_client.dart' as webdav; class WebDav { diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 5945e5f8a..e7778a369 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -32,6 +32,7 @@ import 'package:PiliPlus/plugin/pl_player/models/video_fit_type.dart'; import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/image_utils.dart'; @@ -1855,8 +1856,9 @@ class PlPlayerController { videoPlayerController?.screenshot(format: 'image/png').then((value) { if (value != null) { SmartDialog.showToast('点击弹窗保存截图'); - Get.dialog( - GestureDetector( + showDialog( + context: Get.context!, + builder: (context) => GestureDetector( onTap: () { Get.back(); ImageUtils.saveByteImg( diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 116496ef6..7c24270b2 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -67,7 +67,7 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_volume_controller/flutter_volume_controller.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:media_kit_video/media_kit_video.dart'; import 'package:screen_brightness_platform_interface/screen_brightness_platform_interface.dart'; @@ -177,6 +177,7 @@ class _PLVideoPlayerState extends State animationController.reverse(); } }); + transformationController = TransformationController(); animationController = AnimationController( vsync: this, duration: const Duration(milliseconds: 100), @@ -914,7 +915,7 @@ class _PLVideoPlayerState extends State bool get isFullScreen => plPlayerController.isFullScreen.value; - late final transformationController = TransformationController(); + late final TransformationController transformationController; late ColorScheme colorScheme; late double maxWidth; @@ -2149,8 +2150,9 @@ class _PLVideoPlayerState extends State WebpPreset preset = WebpPreset.def; final success = - await Get.dialog( - AlertDialog( + await showDialog( + context: Get.context!, + builder: (context) => AlertDialog( title: const Text('动态截图'), content: Column( spacing: 12, diff --git a/lib/plugin/pl_player/widgets/app_bar_ani.dart b/lib/plugin/pl_player/widgets/app_bar_ani.dart index 747a6bf62..288aa65ff 100644 --- a/lib/plugin/pl_player/widgets/app_bar_ani.dart +++ b/lib/plugin/pl_player/widgets/app_bar_ani.dart @@ -15,40 +15,45 @@ class AppBarAni extends StatelessWidget { final bool isTop; final bool isFullScreen; + static final _topPos = Tween( + begin: const Offset(0, -1), + end: Offset.zero, + ); + + static const _topDecoration = LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [ + Colors.transparent, + Color(0xBF000000), + ], + tileMode: TileMode.mirror, + ); + + static final _bottomPos = Tween( + begin: const Offset(0, 1.2), + end: Offset.zero, + ); + + static const _bottomDecoration = LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Colors.transparent, + Color(0xBF000000), + ], + tileMode: TileMode.mirror, + ); + @override Widget build(BuildContext context) { return SlideTransition( - position: - Tween( - begin: isTop ? const Offset(0, -1) : const Offset(0, 1.2), - end: Offset.zero, - ).animate( - CurvedAnimation( - parent: controller, - curve: Curves.linear, - ), - ), + position: isTop + ? _topPos.animate(controller) + : _bottomPos.animate(controller), child: DecoratedBox( decoration: BoxDecoration( - gradient: isTop - ? const LinearGradient( - begin: Alignment.bottomCenter, - end: Alignment.topCenter, - colors: [ - Colors.transparent, - Color(0xBF000000), - ], - tileMode: TileMode.mirror, - ) - : const LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - Colors.transparent, - Color(0xBF000000), - ], - tileMode: TileMode.mirror, - ), + gradient: isTop ? _topDecoration : _bottomDecoration, ), child: ViewSafeArea( left: isFullScreen, diff --git a/lib/services/audio_handler.dart b/lib/services/audio_handler.dart index 02eb3f116..26c58664c 100644 --- a/lib/services/audio_handler.dart +++ b/lib/services/audio_handler.dart @@ -7,9 +7,9 @@ import 'package:PiliPlus/models_new/video/video_detail/data.dart'; import 'package:PiliPlus/models_new/video/video_detail/page.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_status.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:audio_service/audio_service.dart'; -import 'package:get/get_utils/get_utils.dart'; Future initAudioService() { return AudioService.init( diff --git a/lib/utils/extension/iterable_ext.dart b/lib/utils/extension/iterable_ext.dart index a4d6bc3c9..db873a06e 100644 --- a/lib/utils/extension/iterable_ext.dart +++ b/lib/utils/extension/iterable_ext.dart @@ -14,6 +14,13 @@ extension IterableExt on Iterable { } return value; } + + T? firstWhereOrNull(bool Function(T element) test) { + for (var element in this) { + if (test(element)) return element; + } + return null; + } } extension ListExt on List { diff --git a/lib/utils/extension/num_ext.dart b/lib/utils/extension/num_ext.dart index c2a9961fb..cf5f1ca9c 100644 --- a/lib/utils/extension/num_ext.dart +++ b/lib/utils/extension/num_ext.dart @@ -1,3 +1,5 @@ +import 'dart:math' show pow; + import 'package:flutter/widgets.dart'; extension ImageExtension on num { @@ -13,3 +15,10 @@ extension IntExt on int? { int? operator +(int other) => this == null ? null : this! + other; int? operator -(int other) => this == null ? null : this! - other; } + +extension DoubleExt on double { + double toPrecision(int fractionDigits) { + var mod = pow(10, fractionDigits.toDouble()).toDouble(); + return ((this * mod).round().toDouble() / mod); + } +} diff --git a/lib/utils/num_utils.dart b/lib/utils/num_utils.dart index b919fa6b0..69412cabf 100644 --- a/lib/utils/num_utils.dart +++ b/lib/utils/num_utils.dart @@ -1,5 +1,5 @@ +import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:flutter/foundation.dart' show kDebugMode, debugPrint; -import 'package:get/get_utils/get_utils.dart'; abstract final class NumUtils { static final _numRegExp = RegExp(r'([\d\.]+)([千万亿])?'); diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index a9d472cfa..6dbf8daa1 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -12,6 +12,7 @@ import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/episode.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/pages/common/common_intro_controller.dart'; +import 'package:PiliPlus/pages/common/publish/publish_route.dart'; import 'package:PiliPlus/pages/contact/view.dart'; import 'package:PiliPlus/pages/fav_panel/view.dart'; import 'package:PiliPlus/pages/share/view.dart'; @@ -20,6 +21,7 @@ import 'package:PiliPlus/services/shutdown_timer_service.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/extension.dart'; +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/global_data.dart'; @@ -32,7 +34,7 @@ import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show FilteringTextInputFormatter; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:url_launcher/url_launcher.dart'; abstract final class PageUtils { @@ -652,49 +654,50 @@ abstract final class PageUtils { if (!context.mounted) { return; } - Get.generalDialog( - barrierLabel: '', - barrierDismissible: true, - pageBuilder: (context, animation, secondaryAnimation) { - if (context.isPortrait) { + Get.key.currentState!.push( + PublishRoute( + pageBuilder: (context, animation, secondaryAnimation) { + if (context.isPortrait) { + return SafeArea( + child: FractionallySizedBox( + heightFactor: 0.7, + widthFactor: 1.0, + alignment: Alignment.bottomCenter, + child: isFullScreen() && padding != null + ? Padding( + padding: EdgeInsets.only(bottom: padding), + child: child, + ) + : child, + ), + ); + } return SafeArea( child: FractionallySizedBox( - heightFactor: 0.7, - widthFactor: 1.0, - alignment: Alignment.bottomCenter, - child: isFullScreen() && padding != null - ? Padding( - padding: EdgeInsets.only(bottom: padding), - child: child, - ) - : child, + widthFactor: 0.5, + heightFactor: 1.0, + alignment: Alignment.centerRight, + child: child, ), ); - } - return SafeArea( - child: FractionallySizedBox( - widthFactor: 0.5, - heightFactor: 1.0, - alignment: Alignment.centerRight, + }, + transitionDuration: const Duration(milliseconds: 350), + transitionBuilder: (context, animation, secondaryAnimation, child) { + final begin = context.isPortrait + ? const Offset(0.0, 1.0) + : const Offset(1.0, 0.0); + return SlideTransition( + position: animation.drive( + Tween( + begin: begin, + end: Offset.zero, + ).chain(CurveTween(curve: Curves.easeInOut)), + ), child: child, - ), - ); - }, - transitionDuration: const Duration(milliseconds: 350), - transitionBuilder: (context, animation, secondaryAnimation, child) { - Offset begin = context.isPortrait - ? const Offset(0.0, 1.0) - : const Offset(1.0, 0.0); - var tween = Tween( - begin: begin, - end: Offset.zero, - ).chain(CurveTween(curve: Curves.easeInOut)); - return SlideTransition( - position: animation.drive(tween), - child: child, - ); - }, - routeSettings: RouteSettings(arguments: Get.arguments), + ); + }, + settings: RouteSettings(arguments: Get.arguments), + ), ); } diff --git a/lib/utils/reply_utils.dart b/lib/utils/reply_utils.dart index 475b06512..984ae078d 100644 --- a/lib/utils/reply_utils.dart +++ b/lib/utils/reply_utils.dart @@ -99,9 +99,10 @@ abstract final class ReplyUtils { await Future.delayed(const Duration(seconds: 8)); } void showReplyCheckResult(String message, {bool isBan = false}) { - Get.dialog( + showDialog( + context: Get.context!, barrierDismissible: isManual, - AlertDialog( + builder: (context) => AlertDialog( title: const Text('评论检查结果'), content: SelectableText(message), actions: [ diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index eef4635b0..cbb084570 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -34,7 +34,7 @@ import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:gt3_flutter_plugin/gt3_flutter_plugin.dart'; abstract final class RequestUtils { @@ -310,9 +310,10 @@ abstract final class RequestUtils { } var res = await DynamicsHttp.dynamicDetail(id: id, clearCookie: true); final isSuccess = res.isSuccess; - Get.dialog( + showDialog( + context: Get.context!, barrierDismissible: isManual, - AlertDialog( + builder: (context) => AlertDialog( title: const Text('动态检查结果'), content: SelectableText( '${isSuccess ? '无账号状态下找到了你的动态,动态正常!' : '你的动态被shadow ban(仅自己可见)!'}${dynText != null ? ' \n\n动态内容: $dynText' : ''}', @@ -534,8 +535,9 @@ abstract final class RequestUtils { } if (PlatformUtils.isDesktop) { - final json = await Get.dialog>( - GeetestWebviewDialog(gt!, challenge!), + final json = await showDialog>( + context: Get.context!, + builder: (context) => GeetestWebviewDialog(gt!, challenge!), ); if (json != null) { captchaData @@ -543,7 +545,7 @@ abstract final class RequestUtils { ..seccode = json['geetest_seccode'] ..geetest = GeetestData( challenge: json['geetest_challenge'], - gt: gt, + gt: gt!, ); gaiaVgateValidate(); } @@ -651,8 +653,9 @@ abstract final class RequestUtils { if (res.isSuccess) { final data = res.data; final show = !data.name.isNullOrEmpty; - Get.dialog( - AlertDialog( + showDialog( + context: Get.context!, + builder: (context) => AlertDialog( title: SelectableText( show ? data.name! : data.rejectPage?.title ?? '', ), diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index 2f2b48831..403260b02 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -33,7 +33,7 @@ import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart' hide ContextExtensionss; +import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:uuid/uuid.dart'; diff --git a/pubspec.lock b/pubspec.lock index 7226edddf..9b43aeea6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -793,7 +793,7 @@ packages: description: path: "." ref: "version_4.7.2" - resolved-ref: "579a8978a922e6c57cebd001320f78674e040418" + resolved-ref: "8b6dcbfb6217d4033204a15702de59588dd955ab" url: "https://github.com/bggRGjQaUbCoE/getx.git" source: git version: "4.7.2"