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