From 4c11dca79240cabcca83e2c4815bb5e3485783ba Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Tue, 11 May 2021 10:11:38 +0530 Subject: [PATCH 1/3] Added a new message list controller --- packages/stream_chat/example/lib/main.dart | 8 ++++---- packages/stream_chat/lib/src/api/channel.dart | 12 +++++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/stream_chat/example/lib/main.dart b/packages/stream_chat/example/lib/main.dart index 11e9779f..bbcc86b8 100644 --- a/packages/stream_chat/example/lib/main.dart +++ b/packages/stream_chat/example/lib/main.dart @@ -79,21 +79,21 @@ class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final messages = channel.state!.channelStateStream; + final messages = channel.state!.messagesStream; return Scaffold( appBar: AppBar( title: Text('Channel: ${channel.id}'), ), body: SafeArea( - child: StreamBuilder( + child: StreamBuilder?>( stream: messages, builder: ( BuildContext context, - AsyncSnapshot snapshot, + AsyncSnapshot?> snapshot, ) { if (snapshot.hasData && snapshot.data != null) { return MessageView( - messages: snapshot.data!.messages.reversed.toList(), + messages: snapshot.data!.reversed.toList(), channel: channel, ); } else if (snapshot.hasError) { diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index a1eab825..8b744cec 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; -import 'package:collection/collection.dart' show IterableExtension; +import 'package:collection/collection.dart' show IterableExtension, ListEquality; import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:rxdart/rxdart.dart'; @@ -1296,6 +1296,8 @@ class ChannelClientState { _channelStateController = BehaviorSubject.seeded(channelState); + _messageListController = BehaviorSubject.seeded(channelState.messages); + _listenTypingEvents(); _listenMessageNew(); @@ -1601,8 +1603,7 @@ class ChannelClientState { List get messages => _channelState.messages; /// Channel message list as a stream - Stream?> get messagesStream => - channelStateStream.map((cs) => cs.messages); + Stream?> get messagesStream => _messageListController.stream; /// Channel pinned message list List? get pinnedMessages => _channelState.pinnedMessages.toList(); @@ -1772,10 +1773,14 @@ class ChannelClientState { /// The channel state related to this client ChannelState get channelState => _channelStateController.value!; late BehaviorSubject _channelStateController; + late BehaviorSubject> _messageListController; final Debounce _debouncedUpdatePersistenceChannelState; set _channelState(ChannelState v) { + if(!const ListEquality().equals(_messageListController.value, v.messages)) { + _messageListController.add(v.messages); + } _channelStateController.add(v); _debouncedUpdatePersistenceChannelState.call([v]); } @@ -1933,6 +1938,7 @@ class ChannelClientState { retryQueue!.dispose(); _subscriptions.forEach((s) => s.cancel()); _channelStateController.close(); + _messageListController.close(); _isUpToDateController.close(); _threadsController.close(); _cleaningTimer.cancel(); From 16ecd0568e2dc96ed899fed7ee6b129345d5cd28 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Tue, 11 May 2021 10:19:09 +0530 Subject: [PATCH 2/3] fix: dartfmt --- packages/stream_chat/lib/src/api/channel.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 8b744cec..e51725e3 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -2,7 +2,8 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; -import 'package:collection/collection.dart' show IterableExtension, ListEquality; +import 'package:collection/collection.dart' + show IterableExtension, ListEquality; import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:rxdart/rxdart.dart'; @@ -1778,7 +1779,8 @@ class ChannelClientState { final Debounce _debouncedUpdatePersistenceChannelState; set _channelState(ChannelState v) { - if(!const ListEquality().equals(_messageListController.value, v.messages)) { + if (!const ListEquality() + .equals(_messageListController.value, v.messages)) { _messageListController.add(v.messages); } _channelStateController.add(v); From 682fe3f4476d673c514b460ca48d0d3a66e9c3c3 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Tue, 11 May 2021 14:55:25 +0530 Subject: [PATCH 3/3] Changed to distinct implementation --- packages/stream_chat/lib/src/api/channel.dart | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index e51725e3..ca3c638a 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -1297,8 +1297,6 @@ class ChannelClientState { _channelStateController = BehaviorSubject.seeded(channelState); - _messageListController = BehaviorSubject.seeded(channelState.messages); - _listenTypingEvents(); _listenMessageNew(); @@ -1604,7 +1602,9 @@ class ChannelClientState { List get messages => _channelState.messages; /// Channel message list as a stream - Stream?> get messagesStream => _messageListController.stream; + Stream?> get messagesStream => channelStateStream + .map((cs) => cs.messages) + .distinct((prev, next) => const ListEquality().equals(prev, next)); /// Channel pinned message list List? get pinnedMessages => _channelState.pinnedMessages.toList(); @@ -1774,15 +1774,10 @@ class ChannelClientState { /// The channel state related to this client ChannelState get channelState => _channelStateController.value!; late BehaviorSubject _channelStateController; - late BehaviorSubject> _messageListController; final Debounce _debouncedUpdatePersistenceChannelState; set _channelState(ChannelState v) { - if (!const ListEquality() - .equals(_messageListController.value, v.messages)) { - _messageListController.add(v.messages); - } _channelStateController.add(v); _debouncedUpdatePersistenceChannelState.call([v]); } @@ -1940,7 +1935,6 @@ class ChannelClientState { retryQueue!.dispose(); _subscriptions.forEach((s) => s.cancel()); _channelStateController.close(); - _messageListController.close(); _isUpToDateController.close(); _threadsController.close(); _cleaningTimer.cancel();