filterable_annotation 1.0.0
filterable_annotation: ^1.0.0 copied to clipboard
Annotations for automatic filter and sort generation with source_gen and build_runner. Build dynamic, type-safe filters for your Dart models.
filterable_annotation #
Annotations for automatic generation of type-safe filter and sort functionality for Dart models. Works seamlessly with filterable_generator and build_runner.
β¨ Features #
- π― Type-safe filtering - Automatic type validation at compile time
- π Dynamic sorting - Sort by any field with ascending/descending order
- π¨ UI-ready metadata - Generate filter UIs dynamically with field information
- π§ Customizable - Custom comparators and comparison functions
- π Enum support - Filter enums by value, index, or name (string)
- π List support - Contains, length, and custom comparisons for lists
- β‘ Optimized - Generated code is efficient and minimal
π¦ Installation #
Add to your pubspec.yaml:
dependencies:
filterable_annotation: ^1.0.0
dev_dependencies:
filterable_generator: ^1.0.0
build_runner: ^2.4.0
π Quick Start #
1. Annotate your model #
import 'package:filterable_annotation/filterable_annotation.dart';
part 'product.filterable.g.dart';
@Filterable()
class Product {
@FilterableField(label: 'Name', comparatorsType: String)
final String name;
@FilterableField(label: 'Price', comparatorsType: double)
final double price;
@FilterableField(label: 'In Stock', comparatorsType: bool)
final bool inStock;
Product({
required this.name,
required this.price,
required this.inStock,
});
}
2. Generate code #
dart run build_runner build
3. Use the generated extension #
// Filter products
final criteria = FilterCriteria(
field: 'price',
comparator: '>=',
value: 100.0,
);
final predicate = ProductFilterExtension.buildPredicate(criteria);
final expensiveProducts = products.where(predicate).toList();
// Sort products
final sortCriteria = SortCriteria(field: 'price', ascending: false);
final sorter = ProductFilterExtension.buildSorter(sortCriteria);
products.sort(sorter);
// Get field metadata for UI generation
final fields = ProductFilterExtension.filterableFields;
for (final field in fields) {
print('${field.label}: ${field.comparators}');
}
π API Reference #
@Filterable() #
Marks a class as filterable. Place this annotation on any class you want to generate filter/sort functionality for.
@FilterableField(...) #
Marks a field as filterable with configuration options:
| Parameter | Type | Required | Description |
|---|---|---|---|
label |
String |
β | Display label for UI generation |
comparatorsType |
Type |
β | Type used for comparison operations |
comparators |
List<String>? |
β | Override default comparators |
customCompare |
Function? |
β | Custom comparison function |
isNullable |
bool? |
β | Auto-detected if not provided |
FilterCriteria #
Represents a filter condition:
FilterCriteria(
field: 'fieldName', // Field to filter
comparator: '==', // Comparison operator
value: someValue, // Value to compare against
);
SortCriteria #
Represents a sort condition:
SortCriteria(
field: 'fieldName', // Field to sort by
ascending: true, // Sort direction
);
π― Supported Types & Comparators #
String #
==, !=, contains, startsWith, endsWith
Numeric (int, double) #
==, !=, >, <, >=, <=
DateTime #
==, !=, >, <, >=, <=
bool #
==, !=
Enum #
==, != (supports enum value, int index, or string name)
List #
contains, notContains, length==, length!=, length>, length<, length>=, length<=
π§ Advanced Usage #
Custom Comparators #
@FilterableField(
label: 'Status',
comparatorsType: String,
comparators: ['==', '!='], // Only allow equality checks
)
final String status;
Custom Comparison Function #
@Filterable()
class Order {
@FilterableField(
label: 'Items',
comparatorsType: int,
customCompare: Order.compareItemById,
)
final List<Item> items;
static bool compareItemById(Item item, int id) {
return item.id == id;
}
}
Enum Filtering #
enum Status { active, inactive, pending }
@Filterable()
class Task {
@FilterableField(label: 'Status', comparatorsType: Status)
final Status status;
}
// Filter by enum value
final criteria1 = FilterCriteria(field: 'status', comparator: '==', value: Status.active);
// Filter by index
final criteria2 = FilterCriteria(field: 'status', comparator: '==', value: 0);
// Filter by name
final criteria3 = FilterCriteria(field: 'status', comparator: '==', value: 'active');
Nullable Fields #
@FilterableField(label: 'Email', comparatorsType: String)
final String? email; // Automatically detected as nullable
π€ Related Packages #
- filterable_generator - Code generator (required)
- build_runner - Build system (required)
π Examples #
Check out the example directory for a complete Flutter app demonstrating all features.
π Issues and Feedback #
Please file issues, bugs, or feature requests in our issue tracker.
π License #
MIT License - see LICENSE file for details.
π Contributing #
Contributions are welcome! Please read our contributing guidelines first.