Null safety trong Flutter

1. Null safety là gì

a. Tổng quan về null safety

  • Trong các ngôn ngữ lập trình hướng đối tượng có một lỗi mà chúng ta rất hay gặp đó là NullPointerException, lỗi này có thể dẫn đến việc ứng dụng bị crash, ảnh hưởng đến trải nghiệm người dùng.
  • Để có thể giúp cho lập trình viên quản lý được việc nullable của một đối tượng từ đó từ khóa null safety xuất hiện.
  • Null safety cho phép bạn chỉ định việc một đối tượng có thể null hay không ngay từ khi khởi tạo. Và khi bạn muốn dùng nó compiler sẽ nhắc cho bạn để bạn có thể xử lý các exception liên quan đến việc biến có thể bị null

b. Null safety trong Flutter và Dart

  • Null safety bắt đầu có từ phiên bản Dart 2.12 và Flutter 2
  • Ở trạng thái mặc định những biến của bạn sẽ ở trạng thái non-nullable, điều đó có nghĩa là nó không thể null trừ khi bạn cho phép nó có thể. Với null safety các lỗi liên quan đến null sẽ chuyển từ các lỗi trong quá trình chạy thành các lỗi trong quá trình viết code. Điều này tránh những sai sót không đáng có trong quá trình chạy ứng dụng.
  • Trình biên dịch Dart có thể tối ưu hóa code, điều sẽ giúp cho project nhỏ hơn và chạy nhanh hơn.

Từ đó chúng ta có bài toán migrate những source code đã được viết trước phiên bản có null safety và biến nó thành source code có sử dụng null safety

2. Cách migrate từ source code không có null safety

a. Migrate code theo một thứ tự

  • Nếu chúng ta có sử dụng nhiều package, chúng ta nên lần lượt migrate chúng theo một thứ tự từ package được sử dụng nhiều nhất trong các package khác trước
Illustration of C/B/A sentence

b. Các bước migrate code sử dụng tool

  • Để demo cho phần này chúng ta sử dụng một class User
class User {
  String name;
  int age;
  int yearOfBirth;
  String des;
  User({this.name, this.age});

  set setCalculate(int cal){
    yearOfBirth = cal;
  }
}

Phiên bản của Dart

sdk: ‘>=2.10.0 <3.0.0'

  • Để bắt đầu chúng ta kiểm tra phiên bản của dart, hãy đảm bảo rằng bạn đang sử dụng phiên bản mới nhất của Dart SDK
dart --version
  • Tiếp theo là kiểm tra trạng thái của các dependency
dart pub outdated --mode=null-safety

Nếu output hiển thị ra như hình dưới đây thì bạn sẽ phải update các dependency

Output of dart pub outdated
  • Sử dụng tool để migrate code

Trước khi bắt đầu migrate chúng ta cần biết về một vài hint marker – những thứ sẽ giúp chúng ta đánh dấu null safety cho các biến.

expression /*!*/Thêm “!” vào trong code của bạn, biến biểu thức đó thành non-nullable
type /*!*/Đánh dấu đối tượng đó là non-nullable
/*?*/Đánh dấu đối tượng đó là nullable
/*late*/Đánh dấu đối tượng đó được khởi tạo sau
/*late final*/Đánh dấu đối tượng được khởi tạo sau nhưng chỉ được khởi tạo một lần
/*required*/Đánh dấu tham số bị yêu cầu

Chúng ta sử dụng lệnh sau ở terminal để bắt đầu quá trình migrate:

dart migrate

Sau một thời gian sẽ có một đường link dẫn đến tool migration, giao diện như sau:

Đến đây chúng ta sẽ bắt đầu dùng những hint marker vào những chỗ được gợi ý dùng

Ở đây chúng ta mong muốn 3 biến name, age, yearOfBirth đều là non-nullable, vì vậy chúng ta thêm /*!*/ vào các biến đó, biến des có thể null vậy chúng ta thêm /*?*/.

Để tiến hành xem các thay đổi chúng ta ấn nút Rerun with changes, những thay đổi sẽ có trong code sau khi được migrate sẽ hiện ra

Giải thích:

  • Hai biến name và age được đánh dấu non-nullable, và được đặt trong cặp dấu ‘{}’ trong constructor, vì vậy từ khóa ‘required’ sẽ được thêm vào để yêu cầu giá trị init cho chúng khi đối tượng User mới được khởi tạo
  • Biến yearOfBirth được đánh dấu là non-nullable, tuy nhiên không xuất hiện trong constructor, vì vậy sẽ có thêm từ khóa ‘late’ từ khóa này
  • Biến des được đánh dấu là nullable do biến đó có thể null.

Sau khi kết thúc quá trình migration, chúng ta ấn nút ‘Apply migration’ để những thay đổi đó xuất hiện trên code của chúng ta

class User {
  String name;
  int age;
  late int yearOfBirth;
  String? des;
  User({required this.name, required this.age});

  set setCalculate(int cal){
    yearOfBirth = cal;
  }
}

Trên đây là code của lớp User sau khi được migrate

Cùng với sự thay đổi ở code, phiên bản của Dart cũng đã được update

sdk: ‘>=2.12.0 <3.0.0'

Đến đây là chúng ta đã hoàn thành quá trình migrate một đoạn code Dart sang null safety

Việc apply null safety đem lại rất nhiều lợi ích cho code của bạn, ngoài việc bắt kịp về mặt công nghệ nó còn giúp code của bạn an toàn hơn, chạy nhanh hơn.

Tham khảo

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.