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