@@ -164,20 +164,35 @@ class AutocompleteViewManager {
164
164
/// * When the object will no longer be used, call [dispose] to free
165
165
/// resources on the [PerAccountStore].
166
166
class MentionAutocompleteView extends ChangeNotifier {
167
- MentionAutocompleteView ._({required this .store, required this .narrow});
167
+ MentionAutocompleteView ._({
168
+ required this .store,
169
+ required this .narrow,
170
+ required this .sortedUsers,
171
+ });
168
172
169
173
factory MentionAutocompleteView .init ({
170
174
required PerAccountStore store,
171
175
required Narrow narrow,
172
176
}) {
173
- final view = MentionAutocompleteView ._(store: store, narrow: narrow);
177
+ final users = store.users.values.toList ();
178
+ final sortedUsers = sortByRelevance (users: users);
179
+ final view = MentionAutocompleteView ._(
180
+ store: store,
181
+ narrow: narrow,
182
+ sortedUsers: sortedUsers,
183
+ );
174
184
store.autocompleteViewManager.registerMentionAutocomplete (view);
175
185
return view;
176
186
}
187
+
188
+ static List <User > sortByRelevance ({required List <User > users}) {
189
+ return users; // TODO(#228) sort for most relevant first
190
+ }
177
191
178
192
@override
179
193
void dispose () {
180
194
store.autocompleteViewManager.unregisterMentionAutocomplete (this );
195
+ sortedUsers.clear ();
181
196
// We cancel in-progress computations by checking [hasListeners] between tasks.
182
197
// After [super.dispose] is called, [hasListeners] returns false.
183
198
// TODO test that logic (may involve detecting an unhandled Future rejection; how?)
@@ -186,6 +201,7 @@ class MentionAutocompleteView extends ChangeNotifier {
186
201
187
202
final PerAccountStore store;
188
203
final Narrow narrow;
204
+ final List <User > sortedUsers;
189
205
190
206
MentionAutocompleteQuery ? get query => _query;
191
207
MentionAutocompleteQuery ? _query;
@@ -209,17 +225,7 @@ class MentionAutocompleteView extends ChangeNotifier {
209
225
List <MentionAutocompleteResult > _results = [];
210
226
211
227
_startSearch (MentionAutocompleteQuery query) async {
212
- List <MentionAutocompleteResult >? newResults;
213
-
214
- while (true ) {
215
- try {
216
- newResults = await _computeResults (query);
217
- break ;
218
- } on ConcurrentModificationError {
219
- // Retry
220
- // TODO backoff?
221
- }
222
- }
228
+ final newResults = await _computeResults (query);
223
229
224
230
if (newResults == null ) {
225
231
// Query was old; new search is in progress. Or, no listeners to notify.
@@ -232,9 +238,8 @@ class MentionAutocompleteView extends ChangeNotifier {
232
238
233
239
Future <List <MentionAutocompleteResult >?> _computeResults (MentionAutocompleteQuery query) async {
234
240
final List <MentionAutocompleteResult > results = [];
235
- final Iterable <User > users = store.users.values;
236
241
237
- final iterator = users .iterator;
242
+ final iterator = sortedUsers .iterator;
238
243
bool isDone = false ;
239
244
while (! isDone) {
240
245
// CPU perf: End this task; enqueue a new one for resuming this work
@@ -245,7 +250,7 @@ class MentionAutocompleteView extends ChangeNotifier {
245
250
}
246
251
247
252
for (int i = 0 ; i < 1000 ; i++ ) {
248
- if (! iterator.moveNext ()) { // Can throw ConcurrentModificationError
253
+ if (! iterator.moveNext ()) {
249
254
isDone = true ;
250
255
break ;
251
256
}
@@ -256,7 +261,7 @@ class MentionAutocompleteView extends ChangeNotifier {
256
261
}
257
262
}
258
263
}
259
- return results; // TODO(#228) sort for most relevant first
264
+ return results;
260
265
}
261
266
}
262
267
0 commit comments