1. Null Safety
Kể từ phiên bản Dart 2.12
và Flutter 2.0
trở đi các biến Non-Nullable
như String, int, ... sẽ mặc định là không thể null để tránh trường hợp các lỗi xảy ra ở runtime, khi bạn sử dụng Null Safety bạn có thể cho phép các biến ở trên trở thành biến Nullable types
. Sau đây mình sẽ giới thiệu cho các bạn cơ bản các Null-aware Operators
.
2. Question Mark: ?
Chúng ta không thể truy cập vào các thuộc tính hay phương thức của một biến không có giá trị( null), toán tử Question Mark: ?
giúp ta khai báo một biến Nullable Type
, khi này giá trị của biến là null và ta có thể truy cập được thuộc tính cũng như phương thức của biến.
Ví dụ:
Với cú pháp String?
ta đã có thể khai báo biến testNull mà không cần gán giá trị cho nó, testNull hiện tại chính là một biến Nullable
. Nhưng vì là null nên ta không thể sử dụng phương thức hay thuộc tính của nó được, để làm điều này đơn giản chúng ta chỉ cần thêm dấu ? vào sau tên biến.
Lúc này khi thực thi, code không còn bị lỗi mà trả về hai giá trị null
.
3. Double Questions Mark: ??
Với Double Questions Mark: ??
chúng ta có thể so sánh giá trị của biến Nullable với một biểu thức khác.
Ví dụ:
Với điều kiện biến testNull là null thì hệ thống sẽ trả về giá trị được so sánh là Other value
.
Còn với điều kiện biến testNull có giá trị, kết quả sẽ trả về giá trị của biến là Value
.
4. Double Questions + Equal Mark: ??=
Với Double Questions + Equal Mark: ??=
chúng ta sẽ có được giá trị của biến Nullable
sau khi so sánh điều kiện biến có null hay không.
Ví dụ:
Khi testNull không có giá trị, hệ thống sẽ gán giá trị của testNull là Other value
sau đó in ra màn hình.
Còn khi testNull đã có giá trị từ trước, hệ thống sẽ in ra giá trị của testNull là Value
.
5. Null-aware Spread Operator: ...?
Với toán tử này chúng ta sẽ nhìn vào ví dụ để dễ hình dung cách thức nó hoạt động.
Ví dụ:
Khi insert một Nullable List
như testNull vào một List khác thì ta sẽ bị lỗi như trên hình, vì vậy để fix lỗi này chúng ta chỉ cần thêm ?
vào sau ...
tạo thành Null-aware Spread Operator: ...?
Và nếu testNull có giá trị thì finalList vẫn sẽ nhận giá trị một cách bình thường.
6. Exclamation Mark: !
Exclamation Mark: !
hiểu đơn giản thì nó sẽ chuyển một thằng Nullable thành Non-Nullable
hoặc dùng nó để check một biến nào đó sẽ không null khi runtime.
Ví dụ
Ta thấy rằng null + ! = crash
vì biến có giá trị null sẽ bị lỗi ở runtime vì vậy chỉ nên sử dụng !
khi bạn biết chắc rằng giá trị của biến sẽ không bao giờ là null.
Nếu biến đã là Non-Nullable
thì sẽ ra kết quả một cách bình thường thôi, !
không chuyển thằng Non-Nullable
ngược lại thành Nullable
đâu nhé!.
7. Late Keyword: late
Nếu bạn muốn khai báo một biến phải mang giá trị có ý nghĩa
khi runtime chứ không phải là null như khi dùng Question Mark: ?
và ta sẽ khởi tạo giá trị cho nó sau chứ không phải ngay lúc này thì ta có thể dùng keyword late
trước khai báo biến. Với late
, nếu bạn quên khởi tạo giá trị cho biến, nó sẽ có giá trị null dẫn đến crash chương trình của bạn khi runtime.
Ví dụ:
Tên của thứ gì đó thì nên có cái tên cụ thể vì vậy ta nên dùng late
thay cho ?
.
Chương trình ở trên sẽ crash vì biến name
chưa được khởi tạo giá trị. Nếu chúng ta khởi tạo giá trị cho nó, chương trình sẽ chạy một cách bình thường( hình dưới).
Tổng kết
Vậy là mình đã giới thiệu cho các bạn những kiến thức cơ bản về các Null-aware Operators
trong Dart và Flutter. Mình cũng chỉ mới tìm hiểu về Dart và Flutter gần đây thôi và kiến thức ở trên là thứ mà mình cóp nhặt được trên mạng, nó có thể đúng có thể sai vì vậy có gì sai sót mong các bạn có thể comment ở phía dưới nhé!.
Tham khảo:
Flutter Null Safety - Johannes Milke: https://youtu.be/5Ro-CZ8Msno
Understanding null safety - Dart.dev: https://dart.dev/null-safety/understanding-null-safety