Skip to Content
Dart📘 Ngôn ngữ DartCascade Notation (..)

Cascade Notation (..) trong Dart

1. Giới thiệu

Cascade notation (..) cho phép thực hiện nhiều operations trên cùng một object.

2. Cú pháp cơ bản

class Person { String name = ''; int age = 0; String city = ''; void introduce() { print('$name, $age, from $city'); } } void main() { // Không dùng cascade var person1 = Person(); person1.name = 'Alice'; person1.age = 25; person1.city = 'Hanoi'; // Dùng cascade var person2 = Person() ..name = 'Bob' ..age = 30 ..city = 'HCMC' ..introduce(); }

3. Cascade với method chaining

class StringBuilder { final StringBuffer _buffer = StringBuffer(); void append(String s) => _buffer.write(s); void appendLine(String s) => _buffer.writeln(s); void clear() => _buffer.clear(); @override String toString() => _buffer.toString(); } void main() { var sb = StringBuilder() ..append('Hello ') ..append('World') ..appendLine('!') ..appendLine('How are you?'); print(sb); }

4. Cascade với List

void main() { var numbers = <int>[] ..add(1) ..add(2) ..add(3) ..addAll([4, 5, 6]) ..remove(3) ..sort(); print(numbers); // [1, 2, 4, 5, 6] }

5. Cascade với Map

void main() { var user = <String, dynamic>{} ..['name'] = 'Alice' ..['age'] = 25 ..['email'] = 'alice@email.com' ..remove('email'); print(user); // {name: Alice, age: 25} }

6. Null-aware Cascade (?..)

class Config { String? host; int? port; } void main() { Config? config; // Không làm gì nếu null config ?..host = 'localhost' ..port = 8080; print(config); // null }

7. Cascade với constructor

class Button { String text = ''; String color = 'blue'; bool enabled = true; VoidCallback? onPressed; Button(this.text); } void main() { var button = Button('Submit') ..color = 'green' ..enabled = true ..onPressed = () => print('Clicked!'); }

8. Nested cascade

class Address { String street = ''; String city = ''; } class Person { String name = ''; Address address = Address(); } void main() { var person = Person() ..name = 'Alice' ..address = (Address() ..street = '123 Main St' ..city = 'Hanoi'); }

9. So sánh với Builder Pattern

// Builder Pattern truyền thống class PersonBuilder { String _name = ''; int _age = 0; PersonBuilder name(String n) { _name = n; return this; } PersonBuilder age(int a) { _age = a; return this; } Person build() => Person(_name, _age); } // Với cascade - không cần builder var person = Person() ..name = 'Alice' ..age = 25;

10. Return value của Cascade

void main() { // Cascade trả về object gốc var list = [3, 1, 2]..sort(); print(list); // [1, 2, 3] // Khác với method return var sorted = [3, 1, 2].toList()..sort(); print(sorted); // [1, 2, 3] }

📝 Tóm tắt

  • .. thực hiện nhiều operations trên object
  • Cascade trả về object gốc
  • ?.. cho nullable objects
  • Thay thế Builder Pattern
  • Làm code ngắn gọn và dễ đọc
Last updated on