@@ -111,34 +111,57 @@ 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;
137
+ }
138
+
139
+ void handleRealmUserAddEvent (RealmUserAddEvent event) {
140
+ for (final view in _getViewsOfType <MentionAutocompleteView >()) {
141
+ view.reassemble ();
142
+ }
126
143
}
127
144
128
145
void handleRealmUserRemoveEvent (RealmUserRemoveEvent event) {
146
+ for (final view in _getViewsOfType <MentionAutocompleteView >()) {
147
+ view.reassemble ();
148
+ }
129
149
autocompleteDataCache.invalidateUser (event.userId);
130
150
}
131
151
132
152
void handleRealmUserUpdateEvent (RealmUserUpdateEvent event) {
153
+ for (final view in _getViewsOfType <MentionAutocompleteView >()) {
154
+ view.reassemble ();
155
+ }
133
156
autocompleteDataCache.invalidateUser (event.userId);
134
157
}
135
158
136
159
/// Called when the app is reassembled during debugging, e.g. for hot reload.
137
160
///
138
- /// Calls [MentionAutocompleteView .reassemble] for all that are registered.
161
+ /// Calls [AutocompleteView .reassemble] for all that are registered.
139
162
///
140
163
void reassemble () {
141
- for (final view in _mentionAutocompleteViews ) {
164
+ for (final view in _allViews ) {
142
165
view.reassemble ();
143
166
}
144
167
}
@@ -185,7 +208,18 @@ abstract class AutocompleteView<Q extends AutocompleteQuery, R extends Autocompl
185
208
final List <R > Function (List <R > results)? resultsFilter;
186
209
final PerAccountStore store;
187
210
188
- AutocompleteView ({required this .dataProvider, this .resultsFilter, required this .store});
211
+ AutocompleteView ({required this .dataProvider, this .resultsFilter, required this .store}) {
212
+ store.autocompleteViewManager.register (this );
213
+ }
214
+
215
+ @override
216
+ void dispose () {
217
+ store.autocompleteViewManager.unregister (this );
218
+ // We cancel in-progress computations by checking [hasListeners] between tasks.
219
+ // After [super.dispose] is called, [hasListeners] returns false.
220
+ // TODO test that logic (may involve detecting an unhandled Future rejection; how?)
221
+ super .dispose ();
222
+ }
189
223
190
224
Q ? get query => _query;
191
225
Q ? _query;
@@ -320,18 +354,7 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
320
354
required Narrow narrow,
321
355
}) : super (dataProvider: MentionAutocompleteDataProvider (
322
356
store: store,
323
- narrow: narrow)) {
324
- store.autocompleteViewManager.registerMentionAutocomplete (this );
325
- }
326
-
327
- @override
328
- void dispose () {
329
- store.autocompleteViewManager.unregisterMentionAutocomplete (this );
330
- // We cancel in-progress computations by checking [hasListeners] between tasks.
331
- // After [super.dispose] is called, [hasListeners] returns false.
332
- // TODO test that logic (may involve detecting an unhandled Future rejection; how?)
333
- super .dispose ();
334
- }
357
+ narrow: narrow));
335
358
}
336
359
337
360
abstract class AutocompleteQuery {
0 commit comments