+5

Cơ bản về Null-aware Operators trong Dart và Flutter.

1. Null Safety

Kể từ phiên bản Dart 2.12Flutter 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: ?

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 vẫn là null nhưng chương trình sẽ không báo lỗi vì cơ chế Null safety nữa.

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ó, Lúc này testNull chính là một biến Nullable Type và vì nó không có giá trị( null) nên ta không thể truy cập vào thuộc tính hay phương thức của biến.

Ví dụ:

Để có thể có thể truy cập vào thuốc tính hay phương thức của biến testNull đơn giản chúng ta chỉ cần thêm dấu ? trước dấu . để tao thành Conditional property access: ?. giúp bạn truy cập vào thuộc tính hay phương thức của biến null.

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 testNullValue.

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: ...? như hình bên dưới:

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


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí