Extension Methods trong Dart
1. Giới thiệu
Extension methods cho phép thêm functionality vào class có sẵn mà không cần kế thừa.
2. Cú pháp cơ bản
extension StringExtension on String {
String capitalize() {
if (isEmpty) return this;
return '${this[0].toUpperCase()}${substring(1)}';
}
}
void main() {
print('hello'.capitalize()); // Hello
}3. Extension cho int
extension IntExtension on int {
bool get isEven => this % 2 == 0;
bool get isOdd => this % 2 != 0;
int squared() => this * this;
Duration get seconds => Duration(seconds: this);
Duration get minutes => Duration(minutes: this);
Duration get hours => Duration(hours: this);
}
void main() {
print(5.squared()); // 25
print(4.isEven); // true
print(5.seconds); // 0:00:05.000000
}4. Extension cho List
extension ListExtension<T> on List<T> {
T? get firstOrNull => isEmpty ? null : first;
T? get lastOrNull => isEmpty ? null : last;
List<T> unique() => toSet().toList();
bool containsAll(List<T> items) {
return items.every((item) => contains(item));
}
}
void main() {
var list = [1, 2, 2, 3, 3, 3];
print(list.unique()); // [1, 2, 3]
print([].firstOrNull); // null
}5. Extension cho DateTime
extension DateTimeExtension on DateTime {
String get formatted => '$day/$month/$year';
bool get isToday {
var now = DateTime.now();
return year == now.year &&
month == now.month &&
day == now.day;
}
bool get isWeekend =>
weekday == DateTime.saturday ||
weekday == DateTime.sunday;
DateTime addDays(int days) => add(Duration(days: days));
}
void main() {
var date = DateTime.now();
print(date.formatted); // 25/12/2024
print(date.isToday); // true
}6. Operators trong Extension
extension on String {
String operator *(int times) {
var result = '';
for (var i = 0; i < times; i++) {
result += this;
}
return result;
}
}
void main() {
print('Hi! ' * 3); // Hi! Hi! Hi!
}7. Generic Extension
extension NullableExtension<T> on T? {
T orDefault(T defaultValue) => this ?? defaultValue;
R? let<R>(R Function(T) transform) {
if (this != null) {
return transform(this as T);
}
return null;
}
}
void main() {
String? name;
print(name.orDefault('Guest')); // Guest
int? value = 5;
print(value.let((v) => v * 2)); // 10
}8. Named Extension để tránh conflict
extension StringUtils on String {
String reverse() => split('').reversed.join();
}
extension AnotherString on String {
String reverse() => 'Another reverse';
}
void main() {
// Sử dụng tên extension khi conflict
print(StringUtils('hello').reverse()); // olleh
}📝 Tóm tắt
extension Name on Typeđể thêm methods- Có thể thêm getters, setters, operators
- Generic extension
- Named extension giải quyết conflicts
- Không thể thêm instance fields
Last updated on