@@ -111,34 +111,51 @@ class AutocompleteIntent<Q extends AutocompleteQuery> {
111
111
///
112
112
/// On reassemble, call [reassemble] .
113
113
class AutocompleteViewManager {
114
- final Set <MentionAutocompleteView > _mentionAutocompleteViews = {};
114
+ final Map < Type , Set <AutocompleteView >> _views = {};
115
115
116
116
AutocompleteDataCache autocompleteDataCache = AutocompleteDataCache ();
117
117
118
- void registerMentionAutocomplete (MentionAutocompleteView view) {
119
- final added = _mentionAutocompleteViews.add (view);
118
+ Set <AutocompleteView > get _allViews => _views.values.fold (
119
+ {}, (previousValue, element) => previousValue..addAll (element));
120
+
121
+ Set <T > _getViewsOfType <T extends AutocompleteView >() {
122
+ return _views[T ]? .cast () ?? {};
123
+ }
124
+
125
+ void register <T extends AutocompleteView >(T view) {
126
+ final typedViews = _views[view.runtimeType] ?? {};
127
+ final added = typedViews.add (view);
120
128
assert (added);
129
+ _views[view.runtimeType] = typedViews;
121
130
}
122
131
123
- void unregisterMentionAutocomplete (MentionAutocompleteView view) {
124
- final removed = _mentionAutocompleteViews.remove (view);
132
+ void unregister <T extends AutocompleteView >(T view) {
133
+ final typedViews = _views[view.runtimeType] ?? {};
134
+ final removed = typedViews.remove (view);
125
135
assert (removed);
136
+ _views[view.runtimeType] = typedViews;
126
137
}
127
138
128
139
void handleRealmUserRemoveEvent (RealmUserRemoveEvent event) {
140
+ for (final view in _getViewsOfType <MentionAutocompleteView >()) {
141
+ view.reassemble ();
142
+ }
129
143
autocompleteDataCache.invalidateUser (event.userId);
130
144
}
131
145
132
146
void handleRealmUserUpdateEvent (RealmUserUpdateEvent event) {
147
+ for (final view in _getViewsOfType <MentionAutocompleteView >()) {
148
+ view.reassemble ();
149
+ }
133
150
autocompleteDataCache.invalidateUser (event.userId);
134
151
}
135
152
136
153
/// Called when the app is reassembled during debugging, e.g. for hot reload.
137
154
///
138
- /// Calls [MentionAutocompleteView .reassemble] for all that are registered.
155
+ /// Calls [AutocompleteView .reassemble] for all that are registered.
139
156
///
140
157
void reassemble () {
141
- for (final view in _mentionAutocompleteViews ) {
158
+ for (final view in _allViews ) {
142
159
view.reassemble ();
143
160
}
144
161
}
@@ -185,7 +202,18 @@ abstract class AutocompleteView<Q extends AutocompleteQuery, R extends Autocompl
185
202
final List <R > Function (List <R > results)? resultsFilter;
186
203
final PerAccountStore store;
187
204
188
- AutocompleteView ({required this .dataProvider, this .resultsFilter, required this .store});
205
+ AutocompleteView ({required this .dataProvider, this .resultsFilter, required this .store}) {
206
+ store.autocompleteViewManager.register (this );
207
+ }
208
+
209
+ @override
210
+ void dispose () {
211
+ store.autocompleteViewManager.unregister (this );
212
+ // We cancel in-progress computations by checking [hasListeners] between tasks.
213
+ // After [super.dispose] is called, [hasListeners] returns false.
214
+ // TODO test that logic (may involve detecting an unhandled Future rejection; how?)
215
+ super .dispose ();
216
+ }
189
217
190
218
Q ? get query => _query;
191
219
Q ? _query;
@@ -319,18 +347,7 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
319
347
required Narrow narrow,
320
348
}) : super (dataProvider: MentionAutocompleteDataProvider (
321
349
store: store,
322
- narrow: narrow)) {
323
- store.autocompleteViewManager.registerMentionAutocomplete (this );
324
- }
325
-
326
- @override
327
- void dispose () {
328
- store.autocompleteViewManager.unregisterMentionAutocomplete (this );
329
- // We cancel in-progress computations by checking [hasListeners] between tasks.
330
- // After [super.dispose] is called, [hasListeners] returns false.
331
- // TODO test that logic (may involve detecting an unhandled Future rejection; how?)
332
- super .dispose ();
333
- }
350
+ narrow: narrow));
334
351
}
335
352
336
353
abstract class AutocompleteQuery {
0 commit comments