From 04ca2c6eebaf5be6d5da4c73041ce13d95fb14cb Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 26 Oct 2021 12:50:40 +0200 Subject: [PATCH] fix(ui): fix scroll to bottom logic --- .../src/positioned_list.dart | 5 ++++- .../src/scrollable_positioned_list.dart | 8 -------- .../lib/src/message_list_view.dart | 19 +++++++++++++++---- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart index 081d67e0..7cd4cf16 100644 --- a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart +++ b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart @@ -325,9 +325,12 @@ class _PositionedListState extends State { for (final element in registeredElements.value!) { final box = element.renderObject as RenderBox; viewport ??= RenderAbstractViewport.of(box) as RenderViewport?; + if (viewport == null) { + continue; + } final key = element.widget.key as IndexedKey; if (widget.scrollDirection == Axis.vertical) { - final reveal = viewport!.getOffsetToReveal(box, 0).offset; + final reveal = viewport.getOffsetToReveal(box, 0).offset; if (!reveal.isFinite) continue; final itemOffset = reveal - viewport.offset.pixels + diff --git a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart index 388e5979..765a90a0 100644 --- a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart +++ b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart @@ -325,14 +325,6 @@ class _ScrollablePositionedListState extends State secondary.target = widget.itemCount - 1; } } - - if (widget.initialScrollIndex != oldWidget.initialScrollIndex || - widget.initialAlignment != oldWidget.initialAlignment) { - _jumpTo( - index: widget.initialScrollIndex, - alignment: widget.initialAlignment, - ); - } } @override 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 3760747d..6798c432 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -465,6 +465,9 @@ class _MessageListViewState extends State { _inBetweenList = true; }, child: ScrollablePositionedList.separated( + key: (initialIndex != 0 && initialAlignment != 0) + ? ValueKey('$initialIndex-$initialAlignment') + : null, itemPositionsListener: _itemPositionListener, initialScrollIndex: initialIndex, initialAlignment: initialAlignment, @@ -795,13 +798,19 @@ class _MessageListViewState extends State { children: [ FloatingActionButton( backgroundColor: _streamTheme.colorTheme.barsBg, - onPressed: () { + onPressed: () async { if (unreadCount > 0) { streamChannel!.channel.markRead(); } if (!_upToDate) { _bottomPaginationActive = false; - streamChannel!.reloadChannel(); + initialAlignment = 0; + initialIndex = 0; + await streamChannel!.reloadChannel(); + + WidgetsBinding.instance?.addPostFrameCallback((_) { + _scrollController!.jumpTo(index: 0); + }); } else { _showScrollToBottom.value = false; _scrollController!.scrollTo( @@ -1057,8 +1066,10 @@ class _MessageListViewState extends State { final scrollToIndex = () { final index = messages.indexWhere((m) => m.id == quotedMessageId); _scrollController?.scrollTo( - index: index, - duration: const Duration(milliseconds: 350), + index: index + 2, // +2 to account for loader and footer + duration: const Duration(seconds: 1), + curve: Curves.easeInOut, + alignment: 0.1, ); }; if (messages.map((e) => e.id).contains(quotedMessageId)) {