|
|
|
@ -25,8 +25,6 @@ class _ChatPageState extends State<ChatPage> { |
|
|
|
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<ChatPage> { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
// 监听消息列表变化 |
|
|
|
// 监听消息列表变化,自动滚动到底部(跳过用户信息卡片) |
|
|
|
_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, |
|
|
|
); |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|