diff --git a/lib/pages/video/detail/reply_reply/controller.dart b/lib/pages/video/detail/reply_reply/controller.dart index 9a5dc185..3b630418 100644 --- a/lib/pages/video/detail/reply_reply/controller.dart +++ b/lib/pages/video/detail/reply_reply/controller.dart @@ -21,7 +21,6 @@ class VideoReplyReplyController extends ReplyController required this.dialog, required this.replyType, required this.isDialogue, - required this.getThemeData, }); final int? dialog; final bool isDialogue; @@ -40,7 +39,6 @@ class VideoReplyReplyController extends ReplyController int? index; AnimationController? controller; - Animation? colorAnimation; late final horizontalPreview = GStorage.horizontalPreview; @@ -61,8 +59,6 @@ class VideoReplyReplyController extends ReplyController return super.onRefresh(); } - final ThemeData Function() getThemeData; - @override bool customHandleResponse(Success response) { if (GlobalData().grpcReply) { @@ -78,15 +74,13 @@ class VideoReplyReplyController extends ReplyController .map((item) => item.id.toInt()) .toList() .indexOf(id!); - if (index != null && index != -1) { + if (index == -1) { + index = null; + } else { controller = AnimationController( duration: const Duration(milliseconds: 300), vsync: this, ); - colorAnimation = ColorTween( - begin: getThemeData().colorScheme.onInverseSurface, - end: getThemeData().colorScheme.surface, - ).animate(controller!); WidgetsBinding.instance.addPostFrameCallback((_) async { if (index != null) { try { @@ -202,4 +196,10 @@ class VideoReplyReplyController extends ReplyController : Mode.MAIN_LIST_HOT; onReload(); } + + @override + void onClose() { + controller?.dispose(); + super.dispose(); + } } diff --git a/lib/pages/video/detail/reply_reply/view.dart b/lib/pages/video/detail/reply_reply/view.dart index 788b38a1..56d6fb72 100644 --- a/lib/pages/video/detail/reply_reply/view.dart +++ b/lib/pages/video/detail/reply_reply/view.dart @@ -68,6 +68,8 @@ class _VideoReplyReplyPanelState context.orientation == Orientation.landscape && _videoReplyReplyController.horizontalPreview; + Animation? colorAnimation; + @override void initState() { super.initState(); @@ -80,7 +82,6 @@ class _VideoReplyReplyPanelState dialog: widget.dialog, replyType: widget.replyType, isDialogue: widget.isDialogue, - getThemeData: () => Theme.of(context), ), tag: '${widget.rpid}${widget.dialog}${widget.isDialogue}', ); @@ -89,9 +90,6 @@ class _VideoReplyReplyPanelState @override void dispose() { widget.onDispose?.call(); - _videoReplyReplyController.controller?.stop(); - _videoReplyReplyController.controller?.dispose(); - _videoReplyReplyController.controller = null; Get.delete( tag: '${widget.rpid}${widget.dialog}${widget.isDialogue}', ); @@ -471,19 +469,24 @@ class _VideoReplyReplyPanelState ), ); } else { - return _videoReplyReplyController.index == index - ? AnimatedBuilder( - animation: _videoReplyReplyController.colorAnimation!, - builder: (context, child) { - return ColoredBox( - color: - _videoReplyReplyController.colorAnimation?.value ?? - Theme.of(context).colorScheme.onInverseSurface, - child: _replyItem(loadingState.response[index], index), - ); - }, - ) - : _replyItem(loadingState.response[index], index); + if (_videoReplyReplyController.index != null && + _videoReplyReplyController.index == index) { + colorAnimation ??= ColorTween( + begin: Theme.of(context).colorScheme.onInverseSurface, + end: Theme.of(context).colorScheme.surface, + ).animate(_videoReplyReplyController.controller!); + return AnimatedBuilder( + animation: colorAnimation!, + builder: (context, child) { + return ColoredBox( + color: colorAnimation!.value ?? + Theme.of(context).colorScheme.onInverseSurface, + child: _replyItem(loadingState.response[index], index), + ); + }, + ); + } + return _replyItem(loadingState.response[index], index); } }(), Error() => replyErrorWidget(