@@ -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,25 +249,22 @@ 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
253
- MentionAutocompleteView .init ({
254
- required super .store,
255
- required this .narrow,
256
- }) : sortedUsers = _usersByRelevance (store: store, narrow: narrow)
257
- {
258
- store.autocompleteViewManager.registerMentionAutocomplete (this );
259
- }
264
+ MentionAutocompleteDataProvider ({
265
+ required this .store,
266
+ required this .narrow
267
+ }) : sortedUsers = _usersByRelevance (store: store, narrow: narrow);
260
268
261
269
final List <User > sortedUsers;
262
270
@@ -303,6 +311,18 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
303
311
_ => 0 ,
304
312
};
305
313
}
314
+ }
315
+
316
+ class MentionAutocompleteView extends AutocompleteView <MentionAutocompleteQuery , MentionAutocompleteResult > {
317
+
318
+ MentionAutocompleteView .init ({
319
+ required super .store,
320
+ required Narrow narrow,
321
+ }) : super (dataProvider: MentionAutocompleteDataProvider (
322
+ store: store,
323
+ narrow: narrow)) {
324
+ store.autocompleteViewManager.registerMentionAutocomplete (this );
325
+ }
306
326
307
327
@override
308
328
void dispose () {
0 commit comments