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