diff --git a/lib/pages/message/chat_page.dart b/lib/pages/message/chat_page.dart index 6ac3441..f7b9f67 100644 --- a/lib/pages/message/chat_page.dart +++ b/lib/pages/message/chat_page.dart @@ -25,8 +25,6 @@ class _ChatPageState extends State { final ScrollController _scrollController = ScrollController(); bool _isLoadingMore = false; late ChatController _controller; - bool _isInitialLoad = true; // 标记是否是首次加载 - int _previousMessageCount = 0; // 记录之前的消息数量 @override void initState() { @@ -46,49 +44,18 @@ class _ChatPageState extends State { } }); - // 监听消息列表变化 + // 监听消息列表变化,自动滚动到底部(跳过用户信息卡片) _controller.messages.listen((_) { - final currentCount = _controller.messages.length; - // 只有在首次加载完成时,或者收到新消息时(消息数量增加),才滚动到底部 - // 但不包括发送消息的情况(因为发送消息时消息数量也会增加) - final shouldScroll = _isInitialLoad || (currentCount > _previousMessageCount && !_controller.messages.last.direction.isSend); - - if (shouldScroll) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (_scrollController.hasClients && _controller.messages.isNotEmpty) { - // 滚动到消息列表的底部(跳过顶部的用户信息卡片) - _scrollController.animateTo( - _scrollController.position.maxScrollExtent, - duration: Duration(milliseconds: 300), - curve: Curves.easeOut, - ); - } - // 首次加载完成后,标记为已完成 - if (_isInitialLoad) { - _isInitialLoad = false; - } - _previousMessageCount = currentCount; - }); - } else { - _previousMessageCount = currentCount; - } - }); - - // 首次加载完成后,滚动到底部 - WidgetsBinding.instance.addPostFrameCallback((_) { - if (_controller.messages.isNotEmpty) { - Future.delayed(Duration(milliseconds: 100), () { - if (_scrollController.hasClients && mounted) { - _scrollController.animateTo( - _scrollController.position.maxScrollExtent, - duration: Duration(milliseconds: 300), - curve: Curves.easeOut, - ); - _isInitialLoad = false; - _previousMessageCount = _controller.messages.length; - } - }); - } + WidgetsBinding.instance.addPostFrameCallback((_) { + if (_scrollController.hasClients && _controller.messages.isNotEmpty) { + // 滚动到消息列表的底部(跳过顶部的用户信息卡片) + _scrollController.animateTo( + _scrollController.position.maxScrollExtent, + duration: Duration(milliseconds: 300), + curve: Curves.easeOut, + ); + } + }); }); }