Skip to content

Commit b0081d4

Browse files
authored
Minor session messages optimization (#935)
Cache Session.messages as an UnmodifiableListView and refresh it only when the underlying map changes, instead of recreating a new unmodifiable list on every getter call. This keeps the data immutable but gives widgets a stable reference, reducing unnecessary rebuilds.
1 parent 615f0f3 commit b0081d4

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

lib/src/agent/session.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,9 @@ class Session extends DisposableChangeNotifier {
156156
};
157157

158158
final LinkedHashMap<String, ReceivedMessage> _messages = LinkedHashMap();
159+
UnmodifiableListView<ReceivedMessage> _messagesView = UnmodifiableListView<ReceivedMessage>(const []);
159160

160-
List<ReceivedMessage> get messages => List.unmodifiable(_messages.values);
161+
List<ReceivedMessage> get messages => _messagesView;
161162

162163
final List<MessageSender> _senders = [];
163164
final List<MessageReceiver> _receivers = [];
@@ -269,6 +270,7 @@ class Session extends DisposableChangeNotifier {
269270
(message) => MapEntry(message.id, message),
270271
),
271272
);
273+
_updateMessagesView();
272274
notifyListeners();
273275
}
274276

@@ -288,6 +290,7 @@ class Session extends DisposableChangeNotifier {
288290
final shouldNotify = existing != message;
289291
_messages[message.id] = message;
290292
if (shouldNotify) {
293+
_updateMessagesView();
291294
notifyListeners();
292295
}
293296
},
@@ -300,6 +303,10 @@ class Session extends DisposableChangeNotifier {
300303
}
301304
}
302305

306+
void _updateMessagesView() {
307+
_messagesView = UnmodifiableListView(_messages.values.toList(growable: false));
308+
}
309+
303310
Future<void> _cancelReceiverSubscriptions() async {
304311
for (final subscription in _receiverSubscriptions) {
305312
await subscription.cancel();

0 commit comments

Comments
 (0)