Flutter

Flutter, Bài 2: Giới thiệu về Dart

Qua bài trước về Dart, tôi hi vọng bạn đã có những kiến thức cơ bản nhất về ngôn ngữ mới này. Thực chất, Dart không có gì khó nếu bạn đã có “gốc gác” Java, C++ hay JavaScript. Càng ngày càng “dấn thân” sâu vào Dart, tôi thực sự mong bạn có cảm tình với nó hơn. Trở lại với bài hướng dẫn, tôi sẽ giới thiệu tiếp những điều bạn cần nắm ở Dart để viết code Flutter dễ dàng hơn.

7. Constructor (tt):

Bạn đã không còn lạ gì với Dart constructors qua bài hướng dẫn trước. Tuy nhiên, Dart có một “đặc sản” mà Java không có, đó là middleware trước khi chạy constructor. Ví dụ:

Ngoài ra, để khống chế những giá trị của tham số trong constructor, bạn có thể sử dụng assert làm middleware, thay vì phải sử dụng trực tiếp trong constructor như Java:

Nếu age < 0 thì object sẽ không được khởi tạo. Ngoài ra, Dart cũng có hỗ trợ một kiểu const constructor, nghĩa là khi bạn tạo một object với constructor này, thì object đó sẽ không được gán giá trị mới. Nói cách khác, const constructor chỉ dùng để gán giá trị cho các biến final hoặc const mà thôi. Bạn chỉ cần thêm từ khóa const trước constructor bạn muốn. Tuy nhiên, việc gán const constructor có vẻ không được sử dụng rộng rãi cho lắm.

8. Anonymous functions:

Đối với những bạn đã quen với Java8 và JavaScript ES6 2015 cũng như Swift, việc bạn viết code ngắn, không khai báo trực tiếp hàm hoặc biến, mà sử dụng mũi tên -> hoặc => hoặc in là điều khá thường xuyên. Đặc biệt là đối với JavaScript khi context thay đổi. Dart cũng cung cấp cú pháp tương tự, tôi đã trình bày một dạng trong bài trước, khi một function có body chỉ chứa vỏn vẹn một dòng bắt đầu bằng return. Khi body có hai dòng, bạn cũng cần cặp dấu ngoặc nhọn là { và } nhưng không cần mũi tên như Java hay JavaScript. Ví dụ:

9. Try – catch – finally

Dart hỗ trợ try – catch – finally y chang như Java và tôi chỉ để đây mà không nói gì thêm.

10. Getters, setters và runtimeType:

Getters và setters của Dart tương tự như trong Kotlin, bạn chỉ cần thêm từ khóa get hoặc set mà thôi. Chẳng hạn:

Object#runtimeType tương ứng với Object#getClass().toString() của Java, dùng để kiểm tra xem một instance thuộc class nào. Chẳng hạn, (new Person(“No one”, 10)).runtimeType == “Person”.

11. Class implementation:

Dart hỗ trợ implements như Java, nhưng không hoàn toàn giống. Và thực tế, có thể bạn sẽ gặp rất nhiều phiền phức với Dart implementation. Câu hướng dẫn chính chủ mang tính mơ hồ này có lẽ chỉ áp dụng đối với những chuyên gia ở Google hơn là so với những bạn mới làm quen với Dart:

Every class implicitly defines an interface containing all the instance members of the class and of any interfaces it implements. If you want to create a class A that supports class B’s API without inheriting B’s implementation, class A should implement the B interface.

Có lẽ, bạn sẽ dễ hiểu hơn với ví dụ bên dưới:

Như vậy, ở đây, bạn không implements một abstract interface như Java, mà implements một class. Cũng như bạn có thể định nghĩa sẵn/lại các members và methods của class được implemented trên class thực hiện implement như ví dụ bên trên. Lưu ý: Với implementation, bạn không có @override như extends.

12. Abstract class và Extend một class:

Tương tự như Java, bạn có thể đặt một abstract class để extend sau này với việc định nghĩa các abstract methods. Và một lần nữa, như Java, chỉ có abstract class mới được phép có abstract methods. Với abstract methods, bạn không cần từ khóa abstract như Java. Ngoài ra, bạn không được trực tiếp gọi new với một constructor của abstract class rồi tự override các methods trên đối tượng như với Java, mà bắt buộc phải thông qua một sub class. Việc extend một class không khác biệt so với Java.

13. Mixins:

Mixins có lẽ là điều cấm kị với nhiều ngôn ngữ, và trong nhiều ngôn ngữ dù ban đầu có hỗ trợ mixins, nhưng về sau đã loại bỏ hẳn. Tuy nhiên, vì chúng ta đang nói tới Dart – một sản phẩm của Google – vâng, chính là Google, nên xuất hiện tính chất “không giống ai” là điều không có gì lạ lẫm. Ban đầu, tôi dự không nói về mixins này vì chúng có hại hơn là lợi, nhưng thôi, đã trót thì trét cho tới, nên tôi giới thiệu luôn.

Nếu xếp việc định nghĩa gián tiếp một class thông qua kế thừa với các mức thang khác nhau, thì mức trên đỉnh là extends, rồi đến implements theo hướng đi xuống, và cuối cùng là mixins. Với mixins, bạn sẽ dùng từ khóa with. Ví dụ:

Bạn cũng có thể cho with nhiều class khác nhau, chẳng hạn:

Với những mixin class có tên các methods giống nhau, class đích (target class) sử dụng method cùng tên của class mixin cuối cùng. Có lẽ Google đã kịp chữa cháy vì trước đây, target class sử dụng method cùng tên trong các mixin class là điều vô cùng khó đoán. Bạn có thể cóp pát ví dụ sau vào DartPad để thấy rõ:

14. Generic Type:

Dart hỗ trợ Generic Type như Java, và bạn đã được giới thiệu sơ qua với List<E>, chẳng hạn, List<String> hay List<double>. Ngoài ra, bạn cũng có thể sử dụng extends, implements như Java, chẳng hạn List<P extends Person>.

Và tới đây, tôi sẽ kết thúc Bài Dart 2. Sang bài sau, tôi sẽ tiếp tục gửi đến các bạn phần Asynchronous operation in Dart. Hẹn gặp lại các bạn.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.