FlutterArtist FilterModelStructure ex2
Note: The article you are viewing is example Demo59b, a minor upgrade from example Demo59a, which adds some configurations so that TildeFilterCriterion(s) are set to default values instead of manual user operations on the FilterPanel.

You see, when you select a new Company, the list of Department(s) will change accordingly, and a particular Department will be selected by default.

No ADS
Similar to example Demo59a, the following is the Field-Based JSON structure you will receive to send to the server for querying and filtering employees.
{
"connector": "AND",
"conditions": [
{
"field": "searchText",
"operator": "containsIgnoreCase",
"value": null
},
{
"connector": "OR",
"conditions": [
{
"field": "departmentId",
"operator": "equalTo",
"value": 4
},
{
"field": "departmentId",
"operator": "equalTo",
"value": 3
}
]
}
]
}1. registerFilterModelStructure
First, let's look at the complete code for the defineFilterModelStructure() method.
Employee59bFilterModel.defineFilterModelStructure()
@override
FilterModelStructure defineFilterModelStructure() {
return FilterModelStructure(
criteriaStructure: FilterCriteriaStructure(
simpleCriterionDefs: [
SimpleFilterCriterionDef<String>(criterionBaseName: "searchText"),
],
multiOptCriterionDefs: [
// Multi Options Single Selection Criterion.
MultiOptFilterCriterionDef<CompanyInfo>.singleSelection(
criterionBaseName: "company",
fieldName: 'companyId',
toFieldValue: (CompanyInfo? rawValue) {
return SimpleVal.ofInt(rawValue?.id);
},
tildeCriterionConfigs: [
TildeCriterionConfig(
suffix: '~1', // company~1
defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
),
TildeCriterionConfig(
suffix: '~2', // company~2
defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
),
],
children: [
// Multi Options Single Selection Criterion.
MultiOptFilterCriterionDef<DepartmentInfo>.singleSelection(
criterionBaseName: "department",
fieldName: 'departmentId',
toFieldValue: (DepartmentInfo? rawValue) {
return SimpleVal.ofInt(rawValue?.id);
},
tildeCriterionConfigs: [
TildeCriterionConfig(
suffix: '~1', // department~1
defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
),
],
),
],
),
],
),
conditionStructure: FilterConditionStructure(
connector: FilterConnector.and,
conditionDefs: [
FilterConditionDef.simple(
tildeCriterionName: "searchText~",
operator: FilterOperator.containsIgnoreCase,
),
FilterConditionDef.group(
groupName: 'G2',
connector: FilterConnector.or,
conditionDefs: [
FilterConditionDef.simple(
tildeCriterionName: "department~1",
operator: FilterOperator.equalTo,
),
FilterConditionDef.simple(
tildeCriterionName: "department~2",
operator: FilterOperator.equalTo,
),
],
),
],
),
);
}tildeCriterionConfigs
Similar to example Demo59a, there will be two TildeCriterion(s) - "company~1" and "company~2" created based on the Criterion("company") blueprint.

No ADS
And here's how to configure the two TildeCriterion(s) mentioned above:
MultiOptCriterionDef<CompanyInfo>
MultiOptFilterCriterionDef<CompanyInfo>.singleSelection(
criterionBaseName: "company",
fieldName: 'companyId',
toFieldValue: (CompanyInfo? rawValue) {
return SimpleVal.ofInt(rawValue?.id);
},
tildeCriterionConfigs: [
TildeCriterionConfig(
suffix: '~1', // company~1
defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
),
TildeCriterionConfig(
suffix: '~2', // company~2
defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
),
],
...
}By default, TildeFilterCriterion(s) are only assigned default values the first time they are initialized. In other words, their default configuration is like this:
(Default Configs)
tildeCriterionConfigs: [
TildeCriterionConfig(
suffix: '~1', // company~1
defaultSettingPolicy: DefaultSettingPolicy.onInitialOnly,
parentMatchSuffix: null,
),
TildeCriterionConfig(
suffix: '~2', // company~2
defaultSettingPolicy: DefaultSettingPolicy.onInitialOnly,
parentMatchSuffix: null,
),
],Similarly, we configure TildeFilterCriterion("department~1"). Note: TildeFilterCriterion("department~2") is not provided with a configuration, so the default configuration will be applied to it.
MultiOptTildeCriterionDef<DepartmentInfo>
MultiOptTildeCriterionDef<DepartmentInfo>.singleSelection(
criterionBaseName: "department",
fieldName: 'departmentId',
toFieldValue: (DepartmentInfo? rawValue) {
return SimpleVal.ofInt(rawValue?.id);
},
tildeCriterionConfigs: [
TildeCriterionConfig(
suffix: '~1', // department~1
defaultSettingPolicy: DefaultSettingPolicy.onEveryLoad,
),
],
),With the above configuration, whenever company~1 changes, department~1 will have a default value, while if company~2 changes, department~2 will be null.

2. specifyDefaultValueForMultiOptTildeCriterion()
After the data is loaded for each MultiOptTildeFilterCriterion, the assignment of a default value is determined by the specifyDefaultValueForMultiOptTildeCriterion() method:
specifyDefaultValueForMultiOptTildeCriterion()
@override
OptValueWrap? specifyDefaultValueForMultiOptTildeCriterion({
required String multiOptTildeCriterionName,
required String multiOptCriterionBaseName,
required Object? parentMultiOptTildeCriterionValue,
required SelectionType selectionType,
required XData multiOptTildeCriterionXData,
}) {
if (multiOptCriterionBaseName == "company") {
var xList = multiOptTildeCriterionXData as ListXData<int, CompanyInfo>;
CompanyInfo? companyInfo = xList.items.firstOrNull;
return OptValueWrap.single(companyInfo);
} else if (multiOptCriterionBaseName == "department") {
var xList = multiOptTildeCriterionXData as ListXData<int, DepartmentInfo>;
DepartmentInfo? departmentInfo = xList.items.firstOrNull;
return OptValueWrap.single(departmentInfo);
}
return null;
}No ADS
FlutterArtist
- Basic concepts in Flutter Artist
- FlutterArtist Block ex1
- FlutterArtist Filter Example
- FlutterArtist FilterModel MultiOptFilterCriterion ex1
- FlutterArtist Form ex1
- The idea of designing filter models in FlutterArtist
- FlutterArtist FormModel.patchFormFields() Ex1
- FlutterArtist BlockQuickItemUpdateAction Ex1
- FlutterArtist BlockNumberPagination Ex1
- FlutterArtist BlockQuickMultiItemCreationAction Ex1
- FlutterArtist ListView Infinite Scroll Pagination Example
- FlutterArtist Pagination
- FlutterArtist Sort DropdownSortPanel Example
- FlutterArtist Dio
- FlutterArtist BackgroundWebDownloadAction ex1
- FlutterArtist Block External Shelf Event ex1
- FlutterArtist Master-detail Blocks ex1
- FlutterArtist Scalar ex1
- FlutterArtist Pagination Davi table Infinite Scroll Ex1
- FlutterArtist Filter FormBuilderField ex1
- FlutterArtist Form Parent-child MultiOptFormProp ex1
- FlutterArtist Manual Sorting ReorderableGridView Example
- FlutterArtist Manual Sorting ReorderableListView
- FlutterArtist Scalar External Shelf Event ex1
- FlutterArtist Code Flow Viewer
- FlutterArtist Log Viewer
- FlutterArtist config
- FlutterArtist StorageStructure
- FlutterArtist Debug Storage Viewer
- FlutterArtist DebugMenu
- FlutterArtist Debug UI Components Viewer
- FlutterArtist Debug Shelf Structure Viewer
- FlutterArtist Context Provider Views
- FlutterArtist FilterModelStructure ex1
- FlutterArtist FilterModelStructure ex2
- FlutterArtist FilterModelStructure ex3
- FlutterArtist Internal Shelf Event ex1
- FlutterArtist Deferring External Shelf Events (Ex1)
- FlutterArtist DropdownSortPanel
Show More