@@ -164,17 +164,29 @@ 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 view = MentionAutocompleteView ._(
178
+ store: store,
179
+ narrow: narrow,
180
+ sortedUsers: _usersByRelevance (store: store),
181
+ );
174
182
store.autocompleteViewManager.registerMentionAutocomplete (view);
175
183
return view;
176
184
}
177
185
186
+ static List <User > _usersByRelevance ({required PerAccountStore store}) {
187
+ return store.users.values.toList (); // TODO(#228): sort for most relevant first
188
+ }
189
+
178
190
@override
179
191
void dispose () {
180
192
store.autocompleteViewManager.unregisterMentionAutocomplete (this );
@@ -186,6 +198,7 @@ class MentionAutocompleteView extends ChangeNotifier {
186
198
187
199
final PerAccountStore store;
188
200
final Narrow narrow;
201
+ final List <User > sortedUsers;
189
202
190
203
MentionAutocompleteQuery ? get query => _query;
191
204
MentionAutocompleteQuery ? _query;
@@ -209,18 +222,7 @@ class MentionAutocompleteView extends ChangeNotifier {
209
222
List <MentionAutocompleteResult > _results = [];
210
223
211
224
Future <void > _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
- }
223
-
225
+ final newResults = await _computeResults (query);
224
226
if (newResults == null ) {
225
227
// Query was old; new search is in progress. Or, no listeners to notify.
226
228
return ;
@@ -232,9 +234,7 @@ class MentionAutocompleteView extends ChangeNotifier {
232
234
233
235
Future <List <MentionAutocompleteResult >?> _computeResults (MentionAutocompleteQuery query) async {
234
236
final List <MentionAutocompleteResult > results = [];
235
- final Iterable <User > users = store.users.values;
236
-
237
- final iterator = users.iterator;
237
+ final iterator = sortedUsers.iterator;
238
238
bool isDone = false ;
239
239
while (! isDone) {
240
240
// CPU perf: End this task; enqueue a new one for resuming this work
@@ -245,7 +245,7 @@ class MentionAutocompleteView extends ChangeNotifier {
245
245
}
246
246
247
247
for (int i = 0 ; i < 1000 ; i++ ) {
248
- if (! iterator.moveNext ()) { // Can throw ConcurrentModificationError
248
+ if (! iterator.moveNext ()) {
249
249
isDone = true ;
250
250
break ;
251
251
}
@@ -256,7 +256,7 @@ class MentionAutocompleteView extends ChangeNotifier {
256
256
}
257
257
}
258
258
}
259
- return results; // TODO(#228) sort for most relevant first
259
+ return results;
260
260
}
261
261
}
262
262
0 commit comments