From aff514d0ccda1925b6c4906401038df2dd901b98 Mon Sep 17 00:00:00 2001 From: Aleksandr Larin Date: Tue, 21 Oct 2025 11:45:28 +0300 Subject: [PATCH 1/8] Add floating date divider builder. --- .../lib/src/message_list_view/floating_date_divider.dart | 6 +++--- .../lib/src/message_list_view/message_list_view.dart | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart b/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart index 9802da666..0a7643bc7 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart @@ -18,7 +18,7 @@ class FloatingDateDivider extends StatelessWidget { required this.itemCount, @Deprecated('No longer used, Will be removed in future versions.') this.isThreadConversation = false, - this.dateDividerBuilder, + this.floatingDateDividerBuilder, }); /// true if this is a thread conversation @@ -43,7 +43,7 @@ class FloatingDateDivider extends StatelessWidget { /// /// If provided, this function will be called with the date of the message /// to create the date divider widget. - final Widget Function(DateTime)? dateDividerBuilder; + final Widget Function(DateTime)? floatingDateDividerBuilder; @override Widget build(BuildContext context) { @@ -67,7 +67,7 @@ class FloatingDateDivider extends StatelessWidget { final message = messages.elementAtOrNull(index - 2); if (message == null) return const Empty(); - if (dateDividerBuilder case final builder?) { + if (floatingDateDividerBuilder case final builder?) { return builder.call(message.createdAt.toLocal()); } diff --git a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart index b273a1acc..db37bd6c3 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart @@ -95,6 +95,7 @@ class StreamMessageListView extends StatefulWidget { this.threadBuilder, this.onThreadTap, this.dateDividerBuilder, + this.floatingDateDividerBuilder, // we need to use ClampingScrollPhysics to avoid the list view to bounce // when we are at the either end of the list view and try to use 'animateTo' // to animate in the same direction. @@ -241,6 +242,10 @@ class StreamMessageListView extends StatefulWidget { /// Builder used to render date dividers final Widget Function(DateTime)? dateDividerBuilder; + /// Builder used to render floating date divider separately from + /// the date dividers in the list + final Widget Function(DateTime)? floatingDateDividerBuilder; + /// Index of an item to initially align within the viewport. final int? initialScrollIndex; @@ -852,7 +857,7 @@ class _StreamMessageListViewState extends State { reverse: widget.reverse, itemPositionListener: _itemPositionListener.itemPositions, messages: messages, - dateDividerBuilder: widget.dateDividerBuilder, + floatingDateDividerBuilder: widget.floatingDateDividerBuilder, ), ), if (widget.showScrollToBottom) From 978ec07fddadf62405d1bfa4f99e4688956119c2 Mon Sep 17 00:00:00 2001 From: Aleksandr Larin Date: Tue, 21 Oct 2025 12:10:36 +0300 Subject: [PATCH 2/8] Fix test implementation. --- .../test/src/message_list_view/floating_date_divider_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart b/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart index 9af5114ba..4ddbc378a 100644 --- a/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart +++ b/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart @@ -160,7 +160,7 @@ void main() { reverse: false, messages: messages, itemCount: itemCount, - dateDividerBuilder: (date) { + floatingDateDividerBuilder: (date) { receivedDate = date; return Container( key: customKey, From a277c3d801a31c7c5b5b87ccbf6b9354ae263433 Mon Sep 17 00:00:00 2001 From: Aleksandr Larin Date: Tue, 21 Oct 2025 12:13:11 +0300 Subject: [PATCH 3/8] Change test name. --- .../test/src/message_list_view/floating_date_divider_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart b/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart index 4ddbc378a..2e8dbc714 100644 --- a/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart +++ b/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart @@ -140,7 +140,7 @@ void main() { ); testWidgets( - 'renders custom dateDividerBuilder when provided', + 'renders custom floatingDateDividerBuilder when provided', (tester) async { itemPositionListener.value = [ const ItemPosition( From 33367b68d06a516cd65265f13bcde39915205e6e Mon Sep 17 00:00:00 2001 From: Aleksandr Larin Date: Tue, 21 Oct 2025 12:28:29 +0300 Subject: [PATCH 4/8] Added change to CHANGELOG.md. --- packages/stream_chat_flutter/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 341f5ecbe..f96539e0a 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,5 +1,9 @@ ## Upcoming +✅ Added + +- Added floatingDateDividerBuilder to StreamMessageListView and FloatingDateDivider. + 🐞 Fixed - Fixed `StreamMessageListView` not marking thread messages as read when scrolled to the bottom of the list. From 5b1a87edf666f21ad85819afe68f84ee0761d5d5 Mon Sep 17 00:00:00 2001 From: Aleksandr Larin Date: Wed, 22 Oct 2025 10:13:32 +0300 Subject: [PATCH 5/8] Implement code suggestions. --- packages/stream_chat_flutter/CHANGELOG.md | 2 +- .../lib/src/message_list_view/floating_date_divider.dart | 6 +++--- .../lib/src/message_list_view/message_list_view.dart | 4 +++- .../src/message_list_view/floating_date_divider_test.dart | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index f96539e0a..e33bbf1fe 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -2,7 +2,7 @@ ✅ Added -- Added floatingDateDividerBuilder to StreamMessageListView and FloatingDateDivider. +- Added `StreamMessageListView.floatingDateDividerBuilder` in order to specifically customize the floating date divider. 🐞 Fixed diff --git a/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart b/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart index 0a7643bc7..9802da666 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view/floating_date_divider.dart @@ -18,7 +18,7 @@ class FloatingDateDivider extends StatelessWidget { required this.itemCount, @Deprecated('No longer used, Will be removed in future versions.') this.isThreadConversation = false, - this.floatingDateDividerBuilder, + this.dateDividerBuilder, }); /// true if this is a thread conversation @@ -43,7 +43,7 @@ class FloatingDateDivider extends StatelessWidget { /// /// If provided, this function will be called with the date of the message /// to create the date divider widget. - final Widget Function(DateTime)? floatingDateDividerBuilder; + final Widget Function(DateTime)? dateDividerBuilder; @override Widget build(BuildContext context) { @@ -67,7 +67,7 @@ class FloatingDateDivider extends StatelessWidget { final message = messages.elementAtOrNull(index - 2); if (message == null) return const Empty(); - if (floatingDateDividerBuilder case final builder?) { + if (dateDividerBuilder case final builder?) { return builder.call(message.createdAt.toLocal()); } diff --git a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart index db37bd6c3..2bc7d0858 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart @@ -857,7 +857,8 @@ class _StreamMessageListViewState extends State { reverse: widget.reverse, itemPositionListener: _itemPositionListener.itemPositions, messages: messages, - floatingDateDividerBuilder: widget.floatingDateDividerBuilder, + dateDividerBuilder: widget.floatingDateDividerBuilder ?? + widget.dateDividerBuilder, ), ), if (widget.showScrollToBottom) @@ -1465,6 +1466,7 @@ class _StreamMessageListViewState extends State { } Message? _lastFullyVisibleMessage; + void _handleLastItemFullyVisible() { // We are using the first message as the last fully visible message // because the messages are reversed in the list view. diff --git a/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart b/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart index 2e8dbc714..9af5114ba 100644 --- a/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart +++ b/packages/stream_chat_flutter/test/src/message_list_view/floating_date_divider_test.dart @@ -140,7 +140,7 @@ void main() { ); testWidgets( - 'renders custom floatingDateDividerBuilder when provided', + 'renders custom dateDividerBuilder when provided', (tester) async { itemPositionListener.value = [ const ItemPosition( @@ -160,7 +160,7 @@ void main() { reverse: false, messages: messages, itemCount: itemCount, - floatingDateDividerBuilder: (date) { + dateDividerBuilder: (date) { receivedDate = date; return Container( key: customKey, From 051480d3bb6895a21e622d2f4cc4f3e7131b0006 Mon Sep 17 00:00:00 2001 From: Aleksandr Larin Date: Wed, 22 Oct 2025 10:14:23 +0300 Subject: [PATCH 6/8] Remove unnecessary spacing. --- .../lib/src/message_list_view/message_list_view.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart index 2bc7d0858..97af9bd13 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart @@ -1466,7 +1466,6 @@ class _StreamMessageListViewState extends State { } Message? _lastFullyVisibleMessage; - void _handleLastItemFullyVisible() { // We are using the first message as the last fully visible message // because the messages are reversed in the list view. From f7e82d8d5efe0a0e222b68161f18ab4f626b2907 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 22 Oct 2025 11:29:44 +0200 Subject: [PATCH 7/8] chore: minor changes --- packages/stream_chat_flutter/CHANGELOG.md | 7 +++++++ .../lib/src/message_list_view/message_list_view.dart | 12 ++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index e7d7385ac..32f43ef94 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## Upcoming + +✅ Added + +- Added `StreamMessageListView.floatingDateDividerBuilder` in order to specifically customize the + floating date divider. + ## 9.18.0 ✅ Added diff --git a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart index 97af9bd13..24fcaa372 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view/message_list_view.dart @@ -242,8 +242,10 @@ class StreamMessageListView extends StatefulWidget { /// Builder used to render date dividers final Widget Function(DateTime)? dateDividerBuilder; - /// Builder used to render floating date divider separately from - /// the date dividers in the list + /// Builder used to render floating date divider that stays on top while scrolling + /// the message list. + /// + /// If null, It will fall back to [dateDividerBuilder] if provided. final Widget Function(DateTime)? floatingDateDividerBuilder; /// Index of an item to initially align within the viewport. @@ -857,8 +859,10 @@ class _StreamMessageListViewState extends State { reverse: widget.reverse, itemPositionListener: _itemPositionListener.itemPositions, messages: messages, - dateDividerBuilder: widget.floatingDateDividerBuilder ?? - widget.dateDividerBuilder, + dateDividerBuilder: switch (widget.floatingDateDividerBuilder) { + final builder? => builder, + _ => widget.dateDividerBuilder, + }, ), ), if (widget.showScrollToBottom) From ab2537538a678687399e7874ca332455c2c586a1 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 22 Oct 2025 11:30:17 +0200 Subject: [PATCH 8/8] chore: minor changes --- packages/stream_chat_flutter/CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 32f43ef94..5c5a166ab 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -7,10 +7,6 @@ ## 9.18.0 -✅ Added - -- Added `StreamMessageListView.floatingDateDividerBuilder` in order to specifically customize the floating date divider. - 🐞 Fixed - Fixed `StreamMessageListView` not marking thread messages as read when scrolled to the bottom of the list.