@@ -151,6 +151,20 @@ class AutocompleteViewManager {
151
151
// void dispose() { … }
152
152
}
153
153
154
+ /// Provides the full list of possible items and filter predicate for
155
+ /// `AutocompleteView` without having to deal with state management or
156
+ /// result computation process.
157
+ ///
158
+ /// Having this factored out of `AutocompleteView` helps in limiting
159
+ /// it's responsibility to managing the autocomplete state and result
160
+ /// computation process.
161
+ abstract class AutocompleteDataProvider <T , Q extends AutocompleteQuery , R extends AutocompleteResult > {
162
+
163
+ Iterable <T > getDataForQuery (Q query);
164
+
165
+ R ? testItem (Q query, T item);
166
+ }
167
+
154
168
/// A view-model for an autocomplete interaction.
155
169
///
156
170
/// The owner of one of these objects must call [dispose] when the object
@@ -164,17 +178,14 @@ class AutocompleteViewManager {
164
178
/// * When the object will no longer be used, call [dispose] to free
165
179
/// resources on the [PerAccountStore].
166
180
abstract class AutocompleteView <Q extends AutocompleteQuery , R extends AutocompleteResult > extends ChangeNotifier {
181
+ final AutocompleteDataProvider <Object , Q , R > dataProvider;
167
182
168
183
/// This could be used to transform results after they've been
169
184
/// computed for sorting, filtering etc.
170
185
final List <R > Function (List <R > results)? resultsFilter;
171
186
final PerAccountStore store;
172
187
173
- AutocompleteView ({this .resultsFilter, required this .store});
174
-
175
- Iterable <Object > getDataForQuery (Q query);
176
-
177
- R ? testItem (Q query, Object item);
188
+ AutocompleteView ({required this .dataProvider, this .resultsFilter, required this .store});
178
189
179
190
Q ? get query => _query;
180
191
Q ? _query;
@@ -221,7 +232,7 @@ abstract class AutocompleteView<Q extends AutocompleteQuery, R extends Autocompl
221
232
222
233
Future <List <R >?> _computeResults (Q query) async {
223
234
final List <R > results = [];
224
- final Iterable <Object > data = getDataForQuery (query);
235
+ final Iterable <Object > data = dataProvider. getDataForQuery (query);
225
236
226
237
final iterator = data.iterator;
227
238
bool isDone = false ;
@@ -238,26 +249,23 @@ abstract class AutocompleteView<Q extends AutocompleteQuery, R extends Autocompl
238
249
isDone = true ;
239
250
break ;
240
251
}
241
- final Object item = iterator.current;
242
- final result = testItem (query, item);
252
+ final result = dataProvider.testItem (query, iterator.current);
243
253
if (result != null ) results.add (result);
244
254
}
245
255
}
246
256
return resultsFilter? .call (results) ?? results;
247
257
}
248
258
}
249
259
250
- class MentionAutocompleteView extends AutocompleteView < MentionAutocompleteQuery , MentionAutocompleteResult > {
260
+ class MentionAutocompleteDataProvider extends AutocompleteDataProvider < Object , MentionAutocompleteQuery , MentionAutocompleteResult > {
251
261
final Narrow narrow;
262
+ final PerAccountStore store;
252
263
final List <User > sortedUsers;
253
264
254
- MentionAutocompleteView .init ({
255
- required super .store,
256
- required this .narrow,
257
- }) : sortedUsers = _usersByRelevance (store: store, narrow: narrow)
258
- {
259
- store.autocompleteViewManager.registerMentionAutocomplete (this );
260
- }
265
+ MentionAutocompleteDataProvider ({
266
+ required this .store,
267
+ required this .narrow
268
+ }) : sortedUsers = _usersByRelevance (store: store, narrow: narrow);
261
269
262
270
static List <User > _usersByRelevance ({
263
271
required PerAccountStore store,
@@ -302,6 +310,18 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
302
310
_ => 0 ,
303
311
};
304
312
}
313
+ }
314
+
315
+ class MentionAutocompleteView extends AutocompleteView <MentionAutocompleteQuery , MentionAutocompleteResult > {
316
+
317
+ MentionAutocompleteView .init ({
318
+ required super .store,
319
+ required Narrow narrow,
320
+ }) : super (dataProvider: MentionAutocompleteDataProvider (
321
+ store: store,
322
+ narrow: narrow)) {
323
+ store.autocompleteViewManager.registerMentionAutocomplete (this );
324
+ }
305
325
306
326
@override
307
327
void dispose () {
0 commit comments