@@ -110,46 +110,59 @@ class AutocompleteIntent<Q extends AutocompleteQuery> {
110
110
///
111
111
/// On reassemble, call [reassemble] .
112
112
class AutocompleteViewManager {
113
- final Set <MentionAutocompleteView > _mentionAutocompleteViews = {};
113
+ final Map < Type , Set <AutocompleteView >> _views = {};
114
114
115
115
AutocompleteDataCache autocompleteDataCache = AutocompleteDataCache ();
116
116
117
- void registerMentionAutocomplete (MentionAutocompleteView view) {
118
- final added = _mentionAutocompleteViews.add (view);
117
+ Set <AutocompleteView > get _allViews => _views.values.fold (
118
+ {},
119
+ (previousValue, element) => previousValue..addAll (element)
120
+ );
121
+
122
+ Set <T > _getViewsOfType <T extends AutocompleteView >() {
123
+ return _views[T ]? .cast () ?? {};
124
+ }
125
+
126
+ void register <T extends AutocompleteView >(T view) {
127
+ final typedViews = _views[view.runtimeType] ?? {};
128
+ final added = typedViews.add (view);
119
129
assert (added);
130
+ _views[view.runtimeType] = typedViews;
120
131
}
121
132
122
- void unregisterMentionAutocomplete (MentionAutocompleteView view) {
123
- final removed = _mentionAutocompleteViews.remove (view);
133
+ void unregister <T extends AutocompleteView >(T view) {
134
+ final typedViews = _views[view.runtimeType] ?? {};
135
+ final removed = typedViews.remove (view);
124
136
assert (removed);
137
+ _views[view.runtimeType] = typedViews;
125
138
}
126
139
127
140
void handleRealmUserAddEvent (RealmUserAddEvent event) {
128
- for (final view in _mentionAutocompleteViews ) {
141
+ for (final view in _getViewsOfType < MentionAutocompleteView >() ) {
129
142
view.refreshStaleUserResults ();
130
143
}
131
144
}
132
145
133
146
void handleRealmUserRemoveEvent (RealmUserRemoveEvent event) {
134
- for (final view in _mentionAutocompleteViews ) {
147
+ for (final view in _getViewsOfType < MentionAutocompleteView >() ) {
135
148
view.refreshStaleUserResults ();
136
149
}
137
150
autocompleteDataCache.invalidateUser (event.userId);
138
151
}
139
152
140
153
void handleRealmUserUpdateEvent (RealmUserUpdateEvent event) {
141
- for (final view in _mentionAutocompleteViews ) {
154
+ for (final view in _getViewsOfType < MentionAutocompleteView >() ) {
142
155
view.refreshStaleUserResults ();
143
156
}
144
157
autocompleteDataCache.invalidateUser (event.userId);
145
158
}
146
159
147
160
/// Called when the app is reassembled during debugging, e.g. for hot reload.
148
161
///
149
- /// Calls [MentionAutocompleteView .reassemble] for all that are registered.
162
+ /// Calls [AutocompleteView .reassemble] for all that are registered.
150
163
///
151
164
void reassemble () {
152
- for (final view in _mentionAutocompleteViews ) {
165
+ for (final view in _allViews ) {
153
166
view.reassemble ();
154
167
}
155
168
}
@@ -188,7 +201,19 @@ abstract class AutocompleteView<Q extends AutocompleteQuery, R extends Autocompl
188
201
final List <R > Function (List <R > results)? resultsFilter;
189
202
final PerAccountStore store;
190
203
191
- AutocompleteView ({required this .dataProvider, this .resultsFilter, required this .store});
204
+ AutocompleteView ({required this .dataProvider, this .resultsFilter, required this .store}) {
205
+ store.autocompleteViewManager.register (this );
206
+ }
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
+ }
192
217
193
218
Q ? get query => _query;
194
219
Q ? _query;
@@ -283,21 +308,8 @@ class MentionAutocompleteDataProvider extends AutocompleteDataProvider<Object, M
283
308
284
309
class MentionAutocompleteView extends AutocompleteView <MentionAutocompleteQuery , MentionAutocompleteResult > {
285
310
286
- MentionAutocompleteView .init ({
287
- required super .store,
288
- }) : super (dataProvider: MentionAutocompleteDataProvider (store: store)) {
289
- store.autocompleteViewManager.registerMentionAutocomplete (this );
290
- }
291
-
292
-
293
- @override
294
- void dispose () {
295
- store.autocompleteViewManager.unregisterMentionAutocomplete (this );
296
- // We cancel in-progress computations by checking [hasListeners] between tasks.
297
- // After [super.dispose] is called, [hasListeners] returns false.
298
- // TODO test that logic (may involve detecting an unhandled Future rejection; how?)
299
- super .dispose ();
300
- }
311
+ MentionAutocompleteView .init ({required super .store}) : super (
312
+ dataProvider: MentionAutocompleteDataProvider (store: store));
301
313
302
314
/// Recompute user results for the current query, if any.
303
315
///
0 commit comments