Null-aware Operators trong Dart
1. Giới thiệu
Dart cung cấp các operators đặc biệt để làm việc an toàn với giá trị nullable.
2. Null-aware access (?.)
void main() {
String? name;
// Thay vì
int? length = name != null ? name.length : null;
// Dùng ?.
int? length2 = name?.length; // null
name = 'Dart';
print(name?.length); // 4
}3. Null coalescing (??)
void main() {
String? name;
// Giá trị mặc định nếu null
String displayName = name ?? 'Guest';
print(displayName); // Guest
// Chained
String? firstName;
String? lastName;
String display = firstName ?? lastName ?? 'Unknown';
}4. Null-aware assignment (??=)
void main() {
String? name;
// Gán chỉ khi null
name ??= 'Default';
print(name); // Default
name ??= 'Another'; // Không gán vì không còn null
print(name); // Default
}5. Null assertion (!)
void main() {
String? name = getName();
// Khẳng định không null
print(name!.toUpperCase()); // Ném exception nếu null
}
String? getName() => 'Dart';6. Cascade với null-aware (?..)
class Person {
String name = '';
int age = 0;
}
void main() {
Person? person;
// Cascade chỉ khi không null
person
?..name = 'Alice'
..age = 25;
print(person); // null (không có gì xảy ra)
}7. late Keyword
class User {
late String name; // Sẽ khởi tạo sau
void init(String n) {
name = n;
}
}
void main() {
var user = User();
user.init('Bob');
print(user.name); // Bob
}8. Collection null-aware
void main() {
List<int>? numbers;
// Spread với null-aware
var list = [0, ...?numbers, 5];
print(list); // [0, 5]
numbers = [1, 2, 3];
var list2 = [0, ...?numbers, 5];
print(list2); // [0, 1, 2, 3, 5]
}9. Kết hợp nhiều operators
class Address {
String? city;
}
class Person {
Address? address;
}
void main() {
Person? person;
// Chain null-aware operators
String city = person?.address?.city ?? 'Unknown';
print(city); // Unknown
}10. Index null-aware (?[])
void main() {
List<int>? numbers;
// Null-aware index access
int? first = numbers?[0];
print(first); // null
numbers = [1, 2, 3];
print(numbers?[0]); // 1
}📝 Tóm tắt
| Operator | Mục đích | Ví dụ |
|---|---|---|
?. | Access an toàn | name?.length |
?? | Giá trị mặc định | name ?? 'Guest' |
??= | Gán nếu null | name ??= 'Default' |
! | Assert non-null | name!.toUpperCase() |
?.. | Cascade an toàn | person?..name = 'A' |
?[] | Index an toàn | list?[0] |
Last updated on