FlutterArtist Sort DropdownSortPanel Example
Sắp xếp dữ liệu là việc sắp xếp dữ liệu theo một thứ tự cụ thể, chẳng hạn như tăng dần hoặc giảm dần, dựa trên một hoặc nhiều tiêu chí. Trong các ứng dụng, việc sắp xếp này có thể được thực hiện ở phía máy khách hoặc phía máy chủ, mỗi phương pháp đều có những ưu và nhược điểm riêng.

Sắp xếp phía máy chủ là việc gửi yêu cầu đến máy chủ để thực hiện thao tác sắp xếp. Sau đó, máy chủ xử lý dữ liệu (thường sử dụng các truy vấn cơ sở dữ liệu) và trả về kết quả đã được sắp xếp cho máy khách. Nếu yêu cầu gửi tới máy chủ bao gồm cả việc phân trang kết quả mà bạn nhận được sẽ khác nhau với các tiêu chí xắp xếp khác nhau.

Sắp xếp phía máy khách liên quan đến việc sắp xếp dữ liệu sẵn có tại máy khách (Có được từ máy chủ trước đó), vì vậy dữ liệu không thay đổi, chỉ có thứ tự của chúng bị thay đổi khi bạn sắp xếp theo các tiêu chí khác nhau.
No ADS

FlutterArtist hỗ trợ cả hai chế độ sắp xếp nói trên, bạn cần cung cấp một SortModelBuilder để định nghĩa các tiêu chí và quy tắc cho việc xắp xếp tại phía máy khách. SortModelBuilder được sử dụng để tạo ra 2 đối tượng SortModel(s), một cái được sử dụng cho việc sắp xếp tại phía máy chủ, cái còn lại sử dụng cho việc sắp xếp tại máy khách.
- Đối với phía máy chủ, ServerSide-SortModel cung cấp các tiêu chí cho việc sắp xếp chẳng hạn, sắp xếp theo giá của sản phẩm và số lượng tồn kho. Thông qua SortPanel người dùng sẽ lựa chọn các tiêu chí được quan tâm và hướng (direction) cho việc xắp xếp, chẳng hạn giảm dần theo giá và tăng dần cho lượng tồn kho.
- Đối với phía máy khách, ClientSide-SortModel cung cấp danh sách các tiêu chí cho xắp sếp và quy tắc để so sánh các dữ liệu theo các tiêu chí đó (Các phương thức trừu tượng mà bạn cần phải triển khai của SortModelBuilder). Người dùng có thể lựa chọn các tiêu chí và hướng (direction) cho mỗi tiêu chí trên SortPanel.
Chú ý, nếu bạn không muốn sử dụng SortModel cho máy khách, người dùng có thể tự sắp xếp các ITEM(s) một cách thủ công thông qua việc kéo thả trên giao diện. Chẳng hạn các ví dụ sau:
- FlutterArtist ReorderableGridView (***)
- FlutterArtist ReorderableListView (***)
Trong bài viết này chúng ta sẽ xem một ví dụ làm thế nào để tạo một SortModel và sử dụng nó cho một Block để xắp xếp các ITEM(s) của Block này.
- Download FlutterArtist Demo
2. Country12aSortModelBuilder
CountryInfo trong ví dụ này là một mô hình dữ liệu mô phỏng một quốc gia với nhiều thuộc tính có thể sử dụng trong việc xắp xếp.
CountryInfo
class CountryInfo {
String id;
String name;
String nameInEnglish;
String countryCode;
String isoCode2;
String isoCode3;
int population;
int area;
double? gdp;
}Trong FlutterArtist, SortModelBuilder là lớp định nghĩa các tiêu chí cho việc sắp xếp, và các quy tắc để sắp xếp tại phía máy khách. SortModelBuilder được sử dụng bởi Block để tạo ra 2 đối tượng SortModel(s) sử dụng cho phía máy khách và máy chủ.
Block (*)
SortModel<ITEM>? get clientSideSortModel;
SortModel<ITEM>? get serverSideSortModel;country12a_sort_model_builder.dart
class Country12aSortModelBuilder extends SortModelBuilder<CountryInfo> {
Country12aSortModelBuilder({
required super.clientSideSortMode,
required super.serverSideSortMode,
});
@override
SortModelStructure defineSortModelStructure() {
return SortModelStructure(
sortCriterionDefs: [
SortCriterionDef(
criterionName: 'nameInEnglish',
text: 'Name In English',
translationKey: "country.nameInEnglish",
),
SortCriterionDef(
criterionName: 'population',
text: 'Population',
translationKey: "country.population",
serverSideConfig: SortCriterionConfig(
initialSortDirection: SortDirection.desc,
),
),
SortCriterionDef(
criterionName: 'area',
text: 'Area',
translationKey: "country.area",
serverSideConfig: SortCriterionConfig(
initialSortDirection: SortDirection.asc,
),
),
],
);
}
@override
Comparable? getComparisonValue({
required CountryInfo item,
required String criterionName,
}) {
if (criterionName == "nameInEnglish") {
return item.nameInEnglish;
} else if (criterionName == "population") {
return item.population;
} else if (criterionName == "area") {
return item.area;
}
return null;
}
@override
String? getTranslationText({required String translationKey}) {
return null;
}
}3. Country12aShelf
Ở bước trên bạn đã tạo ra Country12aSortModelBuilder, bạn cần phải khai báo nó như một thành phần của Country12aBlock.
country12a_shelf.dart
class Country12aShelf extends Shelf {
@override
ShelfStructure defineShelfStructure() {
return ShelfStructure(
filterModels: {},
blocks: [
Country12aBlock(
name: Country12aBlock.blkName,
description: null,
config: BlockConfig(
pageable: Pageable(pageSize: 5),
clientSideSortStrategy: SortStrategy.modelBased,
),
filterModelName: null,
formModel: null,
childBlocks: [],
sortModelBuilder: Country12aSortModelBuilder(
clientSideSortMode: SortMode.single,
serverSideSortMode: SortMode.single,
),
),
],
);
}
Country12aBlock findCountry12aBlock() {
return findBlock(Country12aBlock.blkName) as Country12aBlock;
}
}No ADS
BlockConfig.clientSideSortStrategy
BlockConfig(
...
clientSideSortStrategy: SortStrategy.modelBased,
),Tham số BlockConfig.clientSideSortStrategy chấp nhận một trong các giá trị sau:
none | Với cấu hình này, Block này sẽ không chấp nhận việc sắp xếp tại phía máy khách (bao gồm cả việc sắp xếp thủ công) và block.clientSideSortModel sẽ luôn trả về null. |
modelBased | Với cấu hình này, Block sẽ áp dụng việc sắp xếp tại phía máy khách nếu bạn cung cấp SortModelBuilder cho nó, khi đó block.clientSideSortModel sẽ được đảm bảo khác null. |
manual | Với cấu hình này, Block chấp nhận việc sắp xếp các ITEM(s) của nó một cách thủ công thông qua việc kéo thả trên giao diện. Trong trường hợp này block.clientSideSortModel sẽ luôn luôn null.
|
4. DropdownSortPanel
Trong FlutterArtist, SortPanel là một tiện ích (widget) cơ sở để tạo ra một thành phần giao diện cho phép người dùng lựa chọn các tiêu chí sắp xếp.

Bạn có thể viết các tiện ích SortPanel(s) của riêng mình bằng cách mở rộng từ lớp SortPanel<ITEM> hoặc đơn giản là sử dụng các tiện ích đã được tạo sẵn bởi FlutterArtist.

Một ví dụ với BreadcrumbSortPanel:
- FlutterArtist Multi Sort ex1 (***)
No ADS
Cách sử dụng DropdownSortPanel:

if (country12aBlock.serverSideSortModel != null)
DropdownSortPanel.simple(
sortModel: country12aBlock.serverSideSortModel!,
),
if (country12aBlock.clientSideSortModel != null)
DropdownSortPanel.simple(
sortModel: country12aBlock.clientSideSortModel!,
),Future<void> _clearCriteria() async {
await serverSideSortModel.clearAllSorts();
}5. Country12aBlock
Trong trường hợp một Block sử dụng SortModel cho phía máy chủ, bạn cần chú ý tới tham số sortableCriteria của phương thức Block.performQuery(). SortableCriteria chỉ bao gồm các tiêu chí có hướng (direction) hay nói cách khác là các tiêu chí được chỉ định hướng sắp xếp rõ ràng, tăng dần hoặc giảm dần.
country12a_block.dart (*)
class Country12aBlock
extends
Block<
String, //
CountryInfo,
CountryData,
EmptyFilterInput,
EmptyFilterCriteria,
EmptyFormInput,
EmptyAdditionalFormRelatedData
> {
static const blkName = "country12a-block";
final countryRestProvider = CountryRestProvider();
@override
Future<ApiResult<PageData<CountryInfo>?>> performQuery({
required Object? parentBlockCurrentItem,
required EmptyFilterCriteria filterCriteria,
required SortableCriteria sortableCriteria,
required Pageable pageable,
}) async {
return await countryRestProvider.query(
sortableCriteria: sortableCriteria,
pageable: pageable,
);
}
...
}Chuyển đổi đối tượng SortableCriteria thành một String trước khi truyền nó tới máy chủ:
print(sortableCriteria.toSignedString());
// Output:
// +criterion1,-criterion2
print(sortableCriteria.toJsonString());
// Output:
// {"criterion1": "asc", "criterion2": "desc"}Sau khi chuyển đổi SortableCriteria thành một String, bạn có thể truyền nó vào "Query API", String này sẽ được phân tích tại phía máy chủ để xác định các tiêu chí sắp xếp.
country_rest_provider.dart (**)
...
Future<ApiResult<CountryInfoPage>> query({
required Pageable pageable,
SortableCriteria? sortableCriteria,
String? searchText,
}) async {
Map<String, dynamic>? queryParameters = {
"currentPage": pageable.page,
"pageSize": pageable.pageSize,
"searchText": searchText,
// Json String: '{"criterion1": "asc", "criterion2": "desc"}'.
"jsonSortableCriteria": sortableCriteria?.toJsonString(),
};
// /rest/countryInfoPage
ApiResult<CountryInfoPage> result = await flutterArtistDio.jsonGet(
"/rest/countryInfoPage",
queryParameters: queryParameters,
converter: CountryInfoPage.fromMap,
);
return result;
}No ADS
FlutterArtist
- Basic concepts in Flutter Artist
- FlutterArtist Block ex1
- FlutterArtist Form ex1
- 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 BackgroundWebDownloadAction ex1
- FlutterArtist Master-detail Blocks ex1
- FlutterArtist Scalar ex1
- FlutterArtist Pagination Davi table Infinite Scroll Ex1
- FlutterArtist Form Parent-child MultiOptFormProp ex1
- FlutterArtist Context Provider Views
- FlutterArtist Internal Shelf Event ex1
Show More
