Skip to Content
Dart📘 Ngôn ngữ DartExtension Methods

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