Au revior visibility detector

This commit is contained in:
Ayush Shekhar
2022-04-08 16:43:20 +05:30
parent f659f09ada
commit 62cd0dca25
@@ -945,26 +945,7 @@ class _MessageListViewState extends State<MessageListView> {
int index, int index,
) { ) {
final messageWidget = buildMessage(message, messages, index); final messageWidget = buildMessage(message, messages, index);
return VisibilityDetector( return messageWidget;
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,
);
} }
Widget buildParentMessage( Widget buildParentMessage(
@@ -1283,6 +1264,8 @@ class _MessageListViewState extends State<MessageListView> {
_scrollController = widget.scrollController ?? ItemScrollController(); _scrollController = widget.scrollController ?? ItemScrollController();
_itemPositionListener = _itemPositionListener =
widget.itemPositionListener ?? ItemPositionsListener.create(); widget.itemPositionListener ?? ItemPositionsListener.create();
_itemPositionListener.itemPositions
.addListener(_handleItemPositionsChanged);
_getOnThreadTap(); _getOnThreadTap();
super.initState(); super.initState();
@@ -1331,6 +1314,34 @@ class _MessageListViewState extends State<MessageListView> {
super.didChangeDependencies(); 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() { void _getOnThreadTap() {
if (widget.onThreadTap != null) { if (widget.onThreadTap != null) {
_onThreadTap = (Message message) { _onThreadTap = (Message message) {
@@ -1368,6 +1379,8 @@ class _MessageListViewState extends State<MessageListView> {
streamChannel!.reloadChannel(); streamChannel!.reloadChannel();
} }
_messageNewListener?.cancel(); _messageNewListener?.cancel();
_itemPositionListener.itemPositions
.removeListener(_handleItemPositionsChanged);
super.dispose(); super.dispose();
} }
} }