diff --git a/lib/pages/player/player_item.dart b/lib/pages/player/player_item.dart index 3a9527d5..7d06bd6d 100644 --- a/lib/pages/player/player_item.dart +++ b/lib/pages/player/player_item.dart @@ -591,9 +591,6 @@ class _PlayerItemState extends State playerController.brightnessSeeking = false; playerController.volumeSeeking = false; playerController.canHidePlayerPanel = true; - // Reset danmaku state - infoController.episodeCommentsList.clear(); - infoController.episodeInfo.reset(); super.dispose(); } diff --git a/lib/pages/video/video_page.dart b/lib/pages/video/video_page.dart index c11156bd..2e8502a1 100644 --- a/lib/pages/video/video_page.dart +++ b/lib/pages/video/video_page.dart @@ -32,7 +32,7 @@ class VideoPage extends StatefulWidget { } class _VideoPageState extends State - with SingleTickerProviderStateMixin, WindowListener { + with TickerProviderStateMixin, WindowListener { Box setting = GStorage.setting; final InfoController infoController = Modular.get(); final VideoPageController videoPageController = @@ -50,6 +50,7 @@ class _VideoPageState extends State late GridObserverController observerController; late AnimationController animation; late Animation _rightOffsetAnimation; + late TabController tabController; // 当前播放列表 late int currentRoad; @@ -73,6 +74,7 @@ class _VideoPageState extends State windowManager.addListener(this); // Check fullscreen when enter video page // in case user use system controls to enter fullscreen outside video page + tabController = TabController(length: 2, vsync: this); videoPageController.isDesktopFullscreen(); observerController = GridObserverController(controller: scrollController); animation = AnimationController( @@ -155,6 +157,7 @@ class _VideoPageState extends State ScreenBrightnessPlatform.instance.resetApplicationScreenBrightness(); } catch (_) {} } + infoController.episodeInfo.reset(); infoController.episodeCommentsList.clear(); Utils.unlockScreenRotation(); super.dispose(); @@ -200,6 +203,14 @@ class _VideoPageState extends State clearLogs(); hideDebugConsole(); videoPageController.loading = true; + infoController.episodeInfo.reset(); + infoController.episodeCommentsList.clear(); + // Query comments when tab is visible + // We need lazy load comments to avoid unnecessary API requests + // so we only query comments when the tab is visible rather than video is loaded + if (tabController.index == 1) { + infoController.queryBangumiEpisodeCommentsByID(infoController.bangumiItem.id, episode); + } await playerController.stop(); await videoPageController.changeEpisode(episode, currentRoad: currentRoad, offset: offset); @@ -800,6 +811,7 @@ class _VideoPageState extends State Row( children: [ TabBar( + controller: tabController, dividerHeight: 0, isScrollable: true, tabAlignment: TabAlignment.start, @@ -873,6 +885,7 @@ class _VideoPageState extends State Divider(height: Utils.isDesktop() ? 0.5 : 0.2), Expanded( child: TabBarView( + controller: tabController, children: [ GridViewObserver( controller: observerController,