diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 327f212e3..de504e798 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -100,7 +100,9 @@ class LiveRoomController extends GetxController { // dm LiveDmInfoData? dmInfo; List? savedDanmaku; + int builtLength = 0; RxList messages = [].obs; + bool get shouldRefresh => builtLength != messages.length; late final Rx fsSC = Rx(null); late final RxList superChatMsg = [].obs; RxBool disableAutoScroll = false.obs; @@ -285,7 +287,17 @@ class LiveRoomController extends GetxController { } } - void jumpToBottom() { + void handleJumpToBottom() { + disableAutoScroll.value = false; + if (shouldRefresh) { + messages.refresh(); + WidgetsBinding.instance.addPostFrameCallback(_jumpToBottom); + } else { + _jumpToBottom(); + } + } + + void _jumpToBottom([_]) { if (scrollController.hasClients) { scrollController.jumpTo(scrollController.position.maxScrollExtent); } @@ -349,12 +361,21 @@ class LiveRoomController extends GetxController { disableAutoScroll.value = true; } else if (userScrollDirection == .reverse) { final pos = scrollController.position; - if (pos.maxScrollExtent - pos.pixels <= 100) { + if (pos.maxScrollExtent - pos.pixels <= 100 && disableAutoScroll.value) { disableAutoScroll.value = false; + refreshMsgIfNeeded(); } } } + void refreshMsgIfNeeded() { + if (shouldRefresh) { + WidgetsBinding.instance.addPostFrameCallback((_) { + messages.refresh(); + }); + } + } + @override void onClose() { closeLiveMsg(); diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index c732e4699..8bc25bc84 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -187,7 +187,9 @@ class _LiveRoomPageState extends State void didChangeAppLifecycleState(AppLifecycleState state) { if (plPlayerController.visible = state == .resumed) { if (!plPlayerController.showDanmaku) { - _liveRoomController.startLiveTimer(); + _liveRoomController + ..refreshMsgIfNeeded() + ..startLiveTimer(); plPlayerController.showDanmaku = true; } } else if (state == .paused) { diff --git a/lib/pages/live_room/widgets/chat_panel.dart b/lib/pages/live_room/widgets/chat_panel.dart index cd37b9043..6fcbd7531 100644 --- a/lib/pages/live_room/widgets/chat_panel.dart +++ b/lib/pages/live_room/widgets/chat_panel.dart @@ -52,7 +52,8 @@ class LiveRoomChatPanel extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 12), controller: liveRoomController.scrollController, separatorBuilder: (_, _) => const SizedBox(height: 8), - itemCount: liveRoomController.messages.length, + itemCount: liveRoomController.builtLength = + liveRoomController.messages.length, physics: const ClampingScrollPhysics(), itemBuilder: (_, index) { final item = liveRoomController.messages[index]; @@ -218,17 +219,10 @@ class LiveRoomChatPanel extends StatelessWidget { right: 12, bottom: 0, child: ElevatedButton.icon( - style: ElevatedButton.styleFrom( - visualDensity: VisualDensity.comfortable, - ), - icon: const Icon( - Icons.arrow_downward_rounded, - size: 20, - ), + style: const ButtonStyle(visualDensity: .comfortable), + icon: const Icon(Icons.arrow_downward_rounded, size: 20), label: const Text('回到底部'), - onPressed: () => liveRoomController - ..disableAutoScroll.value = false - ..jumpToBottom(), + onPressed: liveRoomController.handleJumpToBottom, ), ) : const SizedBox.shrink(),