@@ -92,14 +92,20 @@ class MessageStoreImpl extends PerAccountStoreBase with MessageStore {
92
92
@override
93
93
Set <MessageListView > get debugMessageListViews => _messageListViews;
94
94
95
+ bool _disposed = false ;
96
+
95
97
@override
96
98
void registerMessageList (MessageListView view) {
99
+ assert (! _disposed);
97
100
final added = _messageListViews.add (view);
98
101
assert (added);
99
102
}
100
103
101
104
@override
102
105
void unregisterMessageList (MessageListView view) {
106
+ // TODO: Add `assert(!_disposed);` here once we ensure [PerAccountStore] is
107
+ // only disposed after those with references to it are disposed. See
108
+ // [disposed] for details.
103
109
final removed = _messageListViews.remove (view);
104
110
assert (removed);
105
111
}
@@ -137,10 +143,14 @@ class MessageStoreImpl extends PerAccountStoreBase with MessageStore {
137
143
// [InheritedNotifier] to rebuild in the next frame) before the owner's
138
144
// `dispose` or `onNewStore` is called. Discussion:
139
145
// https://chat.zulip.org/#narrow/channel/243-mobile-team/topic/MessageListView.20lifecycle/near/2086893
146
+
147
+ assert (! _disposed);
148
+ _disposed = true ;
140
149
}
141
150
142
151
@override
143
152
Future <void > sendMessage ({required MessageDestination destination, required String content}) {
153
+ assert (! _disposed);
144
154
// TODO implement outbox; see design at
145
155
// https://chat.zulip.org/#narrow/stream/243-mobile-team/topic/.23M3881.20Sending.20outbox.20messages.20is.20fraught.20with.20issues/near/1405739
146
156
return _apiSendMessage (connection,
@@ -152,6 +162,7 @@ class MessageStoreImpl extends PerAccountStoreBase with MessageStore {
152
162
153
163
@override
154
164
void reconcileMessages (List <Message > messages) {
165
+ assert (! _disposed);
155
166
// What to do when some of the just-fetched messages are already known?
156
167
// This is common and normal: in particular it happens when one message list
157
168
// overlaps another, e.g. a stream and a topic within it.
@@ -185,6 +196,7 @@ class MessageStoreImpl extends PerAccountStoreBase with MessageStore {
185
196
required String originalRawContent,
186
197
required String newContent,
187
198
}) async {
199
+ assert (! _disposed);
188
200
if (_editMessageRequests.containsKey (messageId)) {
189
201
throw StateError ('an edit request is already in progress' );
190
202
}
@@ -202,6 +214,8 @@ class MessageStoreImpl extends PerAccountStoreBase with MessageStore {
202
214
} catch (e) {
203
215
// TODO(log) if e is something unexpected
204
216
217
+ if (_disposed) return ;
218
+
205
219
final status = _editMessageRequests[messageId];
206
220
if (status == null ) {
207
221
// The event actually arrived before this request failed
@@ -216,6 +230,7 @@ class MessageStoreImpl extends PerAccountStoreBase with MessageStore {
216
230
217
231
@override
218
232
({String originalRawContent, String newContent}) takeFailedMessageEdit (int messageId) {
233
+ assert (! _disposed);
219
234
final status = _editMessageRequests.remove (messageId);
220
235
_notifyMessageListViewsForOneMessage (messageId);
221
236
if (status == null ) {
0 commit comments