diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 190efc7a..7cd05c38 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -4,6 +4,7 @@ -[[#892]](https://github.com/GetStream/stream-chat-flutter/issues/892): Fix default `initialAlignment` in `MessageListView`. - Fix `MessageInputTheme.inputBackgroundColor` color not being used in some widgets of `MessageInput` +- Removed dependency on `visibility_detector` ## 3.5.1 diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index 9f670f15..2fc7fad0 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -8,7 +8,6 @@ import 'package:stream_chat_flutter/scrollable_positioned_list/scrollable_positi import 'package:stream_chat_flutter/src/extension.dart'; import 'package:stream_chat_flutter/src/swipeable.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; -import 'package:visibility_detector/visibility_detector.dart'; /// Widget builder for message /// [defaultMessageWidget] is the default [MessageWidget] configuration @@ -945,26 +944,7 @@ class _MessageListViewState extends State { int index, ) { final messageWidget = buildMessage(message, messages, index); - return VisibilityDetector( - key: ValueKey('visibility: ${message.id}'), - onVisibilityChanged: (visibility) { - final isVisible = visibility.visibleBounds != Rect.zero; - if (isVisible) { - final channel = streamChannel.channel; - if (_upToDate && - channel.config?.readEvents == true && - channel.state!.unreadCount > 0) { - streamChannel.channel.markRead(); - } - } - if (mounted) { - if (_showScrollToBottom.value == isVisible) { - _showScrollToBottom.value = !isVisible; - } - } - }, - child: messageWidget, - ); + return messageWidget; } Widget buildParentMessage( @@ -1283,6 +1263,8 @@ class _MessageListViewState extends State { _scrollController = widget.scrollController ?? ItemScrollController(); _itemPositionListener = widget.itemPositionListener ?? ItemPositionsListener.create(); + _itemPositionListener.itemPositions + .addListener(_handleItemPositionsChanged); _getOnThreadTap(); super.initState(); @@ -1331,6 +1313,34 @@ class _MessageListViewState extends State { super.didChangeDependencies(); } + void _handleItemPositionsChanged() { + final _itemPositions = _itemPositionListener.itemPositions.value.toList(); + final _firstItemIndex = + _itemPositions.indexWhere((element) => element.index == 1); + var _isFirstItemVisible = false; + if (_firstItemIndex != -1) { + final _firstItem = _itemPositions[_firstItemIndex]; + _isFirstItemVisible = + _firstItem.itemLeadingEdge > 0 && _firstItem.itemTrailingEdge < 1; + } + if (_isFirstItemVisible) { + // most recent message is visible + final channel = streamChannel?.channel; + if (channel != null) { + if (_upToDate && + channel.config?.readEvents == true && + channel.state!.unreadCount > 0) { + streamChannel!.channel.markRead(); + } + } + } + if (mounted) { + if (_showScrollToBottom.value == _isFirstItemVisible) { + _showScrollToBottom.value = !_isFirstItemVisible; + } + } + } + void _getOnThreadTap() { if (widget.onThreadTap != null) { _onThreadTap = (Message message) { @@ -1368,6 +1378,8 @@ class _MessageListViewState extends State { streamChannel!.reloadChannel(); } _messageNewListener?.cancel(); + _itemPositionListener.itemPositions + .removeListener(_handleItemPositionsChanged); super.dispose(); } } diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 2abc216f..0c7bcaf6 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -43,7 +43,6 @@ dependencies: video_compress: ^3.0.0 video_player: ^2.1.0 video_thumbnail: ^0.4.3 - visibility_detector: ^0.2.0 flutter: assets: