Skip to content

Commit cfce389

Browse files
gnpricechrisbobbe
authored andcommitted
autocomplete [nfc]: Give subclasses control of computeResults
This gives AutocompleteView subclasses the flexibility to have an implementation that's more than a single loop through candidates.
1 parent 8d2d06f commit cfce389

File tree

1 file changed

+31
-25
lines changed

1 file changed

+31
-25
lines changed

lib/model/autocomplete.dart

+31-25
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,6 @@ abstract class AutocompleteView<QueryT extends AutocompleteQuery, ResultT extend
192192

193193
final PerAccountStore store;
194194

195-
Iterable<CandidateT> getSortedItemsToTest();
196-
197-
ResultT? testItem(QueryT query, CandidateT item);
198-
199195
QueryT? get query => _query;
200196
QueryT? _query;
201197
set query(QueryT? query) {
@@ -218,7 +214,7 @@ abstract class AutocompleteView<QueryT extends AutocompleteQuery, ResultT extend
218214
List<ResultT> _results = [];
219215

220216
Future<void> _startSearch() async {
221-
final newResults = await _computeResults();
217+
final newResults = await computeResults();
222218
if (newResults == null) {
223219
// Query was old; new search is in progress. Or, no listeners to notify.
224220
return;
@@ -228,6 +224,15 @@ abstract class AutocompleteView<QueryT extends AutocompleteQuery, ResultT extend
228224
notifyListeners();
229225
}
230226

227+
/// Compute the autocomplete results for the current query,
228+
/// returning null if the search aborts early.
229+
///
230+
/// Implementations should call [shouldStop] at regular intervals,
231+
/// and abort if it completes with true.
232+
/// Consider using [filterCandidates].
233+
@protected
234+
Future<List<ResultT>?> computeResults();
235+
231236
/// Completes in a later microtask, returning true if evaluation
232237
/// of the current query should stop and false if it should continue.
233238
///
@@ -249,15 +254,6 @@ abstract class AutocompleteView<QueryT extends AutocompleteQuery, ResultT extend
249254
return false;
250255
}
251256

252-
Future<List<ResultT>?> _computeResults() async {
253-
final results = <ResultT>[];
254-
if (await filterCandidates(filter: testItem,
255-
candidates: getSortedItemsToTest(), results: results)) {
256-
return null;
257-
}
258-
return results;
259-
}
260-
261257
/// Examine the given candidates against `query`, adding matches to `results`.
262258
///
263259
/// This function chunks its work for interruption using [shouldStop],
@@ -312,14 +308,18 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
312308
final List<User> sortedUsers;
313309

314310
@override
315-
Iterable<User> getSortedItemsToTest() {
316-
return sortedUsers;
311+
Future<List<MentionAutocompleteResult>?> computeResults() async {
312+
final results = <MentionAutocompleteResult>[];
313+
if (await filterCandidates(filter: _testUser,
314+
candidates: sortedUsers, results: results)) {
315+
return null;
316+
}
317+
return results;
317318
}
318319

319-
@override
320-
MentionAutocompleteResult? testItem(MentionAutocompleteQuery query, User item) {
321-
if (query.testUser(item, store.autocompleteViewManager.autocompleteDataCache)) {
322-
return UserMentionAutocompleteResult(userId: item.userId);
320+
MentionAutocompleteResult? _testUser(MentionAutocompleteQuery query, User user) {
321+
if (query.testUser(user, store.autocompleteViewManager.autocompleteDataCache)) {
322+
return UserMentionAutocompleteResult(userId: user.userId);
323323
}
324324
return null;
325325
}
@@ -618,12 +618,18 @@ class TopicAutocompleteView extends AutocompleteView<TopicAutocompleteQuery, Top
618618
}
619619

620620
@override
621-
Iterable<String> getSortedItemsToTest() => _topics;
621+
Future<List<TopicAutocompleteResult>?> computeResults() async {
622+
final results = <TopicAutocompleteResult>[];
623+
if (await filterCandidates(filter: _testTopic,
624+
candidates: _topics, results: results)) {
625+
return null;
626+
}
627+
return results;
628+
}
622629

623-
@override
624-
TopicAutocompleteResult? testItem(TopicAutocompleteQuery query, String item) {
625-
if (query.testTopic(item)) {
626-
return TopicAutocompleteResult(topic: item);
630+
TopicAutocompleteResult? _testTopic(TopicAutocompleteQuery query, String topic) {
631+
if (query.testTopic(topic)) {
632+
return TopicAutocompleteResult(topic: topic);
627633
}
628634
return null;
629635
}

0 commit comments

Comments
 (0)