@@ -13,6 +13,7 @@ import 'package:flutter/material.dart';
1313import '../primitives/utils.dart' ;
1414import 'common_widgets.dart' ;
1515
16+ /// A mapping from filter kinds to [QueryFilterArgument] s.
1617typedef QueryFilterArgs <T > = Map <String , QueryFilterArgument <T >>;
1718typedef SettingFilters <T > = List <SettingFilter <T , Object >>;
1819
@@ -39,7 +40,7 @@ mixin FilterControllerMixin<T> on DisposableController
3940 ///
4041 /// This should be overriden as a getter by subclasses to support persisting
4142 /// the most recent filter to DevTools preferences.
42- ValueNotifier <String >? filterTagNotifier;
43+ ValueNotifier <String >? get filterTagNotifier => null ;
4344
4445 ValueListenable <Filter <T >> get activeFilter => _activeFilter;
4546
@@ -94,6 +95,7 @@ mixin FilterControllerMixin<T> on DisposableController
9495 /// query with arguments may look like 'foo category:bar type:baz'. In this
9596 /// example, 'category' and 'type' would need to be defined as query filter
9697 /// arguments.
98+ @visibleForOverriding
9799 QueryFilterArgs <T > createQueryFilterArgs () =>
98100 < String , QueryFilterArgument <T >> {};
99101
@@ -244,12 +246,11 @@ class _FilterDialogState<T> extends State<FilterDialog<T>>
244246 mainAxisSize: MainAxisSize .min,
245247 crossAxisAlignment: CrossAxisAlignment .start,
246248 children: [
247- for (final filter in widget.controller.settingFilters) ...[
249+ for (final filter in widget.controller.settingFilters)
248250 if (filter is ToggleFilter <T >)
249251 _ToggleFilterElement (filter: filter)
250252 else
251253 _SettingFilterElement (filter: filter),
252- ],
253254 ],
254255 ),
255256 );
@@ -452,14 +453,14 @@ class SettingFilter<T, V> {
452453 Map <String , Object ?> get valueAsJson => {id: setting.value};
453454}
454455
455- class QueryFilter {
456+ class QueryFilter < T > {
456457 const QueryFilter ._({
457- this . filterArguments = const < String , QueryFilterArgument > {},
458+ QueryFilterArgs < T > filterArguments = const {},
458459 this .substringExpressions = const < Pattern > [],
459460 this .isEmpty = false ,
460- });
461+ }) : _filterArguments = filterArguments ;
461462
462- factory QueryFilter .empty ({required QueryFilterArgs args}) {
463+ factory QueryFilter .empty ({required QueryFilterArgs < T > args}) {
463464 return QueryFilter ._(
464465 filterArguments: args,
465466 substringExpressions: < Pattern > [],
@@ -469,7 +470,7 @@ class QueryFilter {
469470
470471 factory QueryFilter .parse (
471472 String query, {
472- required QueryFilterArgs args,
473+ required QueryFilterArgs < T > args,
473474 required bool useRegExp,
474475 }) {
475476 if (query.isEmpty) {
@@ -529,7 +530,12 @@ class QueryFilter {
529530 );
530531 }
531532
532- final QueryFilterArgs filterArguments;
533+ /// The mapping of filter kinds fo [QueryFilterArgument] s.
534+ final QueryFilterArgs <T > _filterArguments;
535+
536+ /// The collection of all [QueryFilterArgument] s.
537+ Iterable <QueryFilterArgument <T >> get filterArguments =>
538+ _filterArguments.values;
533539
534540 final List <Pattern > substringExpressions;
535541
@@ -540,7 +546,7 @@ class QueryFilter {
540546 ? ''
541547 : [
542548 ...substringExpressions.toStringList (),
543- for (final arg in filterArguments.values ) arg.display,
549+ for (final arg in filterArguments) arg.display,
544550 ].join (' ' ).trim ();
545551}
546552
0 commit comments