Flutter with Dart: Làm quen với ngôn ngữ lập trình Dart
Mở đầu
iOS và Android đang là hai nền tảng mobile hàng đầu trên thế giới với rất nhiều những điểm khác biệt nhau. Tất nhiên là chúng có môi trường phát triển ứng dụng hoàn toàn khác nhau. Từ đó sinh ra nhiều khó khăn cho anh em mobile developer khi phải phát triển cùng một ứng dụng nhưng phải lập trình trên hai nền tảng khác nhau, gây mất nhiều thời gian, công sức và tiền bạc. Đã có nhiều nền tảng cross platform ra đời để giải quyết vấn đề trên như Xamarin, PhoneGap, React-Native, … Không nằm ngoài cuộc chơi cross platform Google cũng cho ra đời nền tảng Flutter của mình với nhiều ưu điểm như:
- Sử dụng ngôn ngữ lập trình Dart đơn giản và dễ học
- Phát triển ứng dụng nhanh
- Giao diện người dùng đẹp và linh hoạt
- Hỗ trợ rất nhiều widget khác nhau
- Thể hiện cùng một UI trên nhiều nền tảng
- Framework hiện đại, hiệu năng cao
- Phiên bản mới Flutter 2 đã hỗ trợ cả nền tảng Web và Desktop
Thế là tôi cũng bắt đầu tìm hiểu về Flutter. Dù đã có chút kinh nghiệm phát triển ứng dụng Android mobile nhưng Flutter vẫn có những thứ rất mới lạ với tôi. Đầu tiên phải kể đến ngôn ngữ Dart. Bài viết này tôi sẽ ghi lại những kiến thức rất cơ bản mà mình học được về ngôn ngữ Dart. Vì là những ghi chú cá nhân và cũng phụ thuộc vào thiết bị cá nhân tôi sử dụng nên chắc chắn không thể đầy đủ cho tất cả mọi người, hi vọng nó vẫn giúp ích được phần nào cho các bạn.
Để test những phần tôi ghi chú về Dart, bạn có thể tự cài đặt môi trường để thực hành nhé. Tôi có hướng dẫn qua ở dưới. Hoặc bạn cũng có thể thử công cụ online tại https://dartpad.dev/?null_safety=true
Cài đặt môi trường lập trình Dart
Như đã nói ở trên, cá nhân tôi đang sử dụng máy Mac và mục tiêu xa là tìm hiểu Flutter nên tôi sẽ hướng dẫn cài đặt kèm Flutter SDK trên Mac luôn. Trong Flutter SDK đã hỗ trợ sẵn Dart.
- Tải Flutter SDK tại https://flutter.dev/docs/development/tools/sdk/releases?tab=macos
- Sau đó giải nén vào thư mục mong muốn. Ví dụ: /Users/liem_nt/work/
- Mở Terminal, thêm công cụ flutter vào path môi trường. Hoặc thêm vào file ~/.bash_profile
export FLUTTER_PATH="/Users/liem_nt/work/flutter/bin" export PATH=$PATH:$FLUTTER_PATH
- Nếu thêm vào file ~/.bash_profile, cần chạy lệnh dưới để áp dụng luôn
source ~/.bash_profile
- Để tiến hành hoàn thiện cài đặt Flutter SDK, chạy lệnh dưới và làm theo hướng dẫn. Còn nếu chỉ dừng lại ở phần thử nghiệm Dart, bạn có thể bỏ qua bước này.
flutter doctor
- Kiểm tra Dart đã được cài đặt
dart --version
Đã xong phần cài đặt môi trường.
Dart Hello World
Không cần nói nhiều về tiêu đề mục này nhé.
Tạo file hello.dart và nhập vào
main() { print("Hello World!"); }
Để chạy 1 chương trình dart như trên, nhập lệnh dưới và xem kết quả
dart hello.dart
Cú pháp cơ bản
- Mọi lớp đều kế thừa từ lớp cơ sở có tên
Object
- Mọi thứ lưu trong biến đều là đối tượng (kể cả số, kể cả null)
- Sử dụng từ khóa
dynamic
khi khai báo biến có chấp nhận mọi kiểu - Dart hỗ trợ định nghĩa kiểu generic
- Dart cho phép định nghĩa hàm trong hàm (lồng nhau)
- Dart không có từ khóa
public, private, protected
khi khai báo phương thức, thuộc tính lớp. Nếu thuộc tính, tên lớp bắt đầu bằng_
thì hiểu đó làprivate
- Tên biến, tên hàm, tên lớp … là chuỗi chữ có thể kế hợp với số và có thể bắt đầu bằng
_
1. Hàm main
1 chương trình Dart sẽ bắt đầu chạy từ hàm main, hàm main có thể nhận vào tham số hoặc không.
main() { }
main(List<String> args) { }
2. Import thư viện
import 'dart:math'; // import thư viện có sẵn import 'hello.dart'; // import thư viện từ file khác
3. Khai báo biến
Sử dụng từ khoá var
hoặc dynamic
hoặc chỉ định kiểu
var a = "Learn Dart"; // Khai báo biến a, khởi tạo là 1 chuỗi a = "Learn Dart 2"; // Gán chuỗi khác a = 100; // Lỗi vì gán số vào a var b; // Khai báo và không khởi tạo b = 100; // Gán số vào b b = "aaa"; // Gán chuỗi vào b String s = 'Chuỗi ký tự'; // Khai báo biến chuỗi double d = 1.1234; // khai báo biến số thực int i = 1; // biến số nguyên bool found = true; // biến logic dynamic dyn = 123; // Khai báo biến chấp nhận mọi kiểu, khởi tạo là số int dyn = "Dynamic"; // Gán chuỗi dyn = 1.12345; // Gán số double
4. Hằng số
Sử dụng từ khóa const
hoặc final
để tạo ra hằng số.
Hằng số const
phải có giá trị cụ thể ngay khi viết code, còn final
có thể sử dụng tạo hằng số trong khi chạy chương trình, và sau đó sẽ không thay đổi.
const monday = 'Monday'; // OK const minutes = 24 * 60; // OK var so_ngau_nhien = Random(1000).nextInt(500); final a = so_ngau_nhien * 2; // OK const b = so_ngau_nhien * 2; // Lỗi
5. Toán tử số học
Đa số tương tự các ngôn ngữ khác như +
, -
, *
, ++
, --
, chia lấy phần dư %
… nhưng có 2 toán tử sau cần chú ý:
/
Phép chia, luôn cho ra kết quả là số thực. Ví dụ:5 / 6
kết quả0.8333333333333334
~/
Phép chia lấy phần nguyên.6 ~/ 4
kết quả1
6. Toán tử trên lớp, đối tượng
Chú ý:
as
Chuyển kiểu:(a as MyClass)
is
Kiểm tra kiểu:(a is MyClass)
is!
Kiểm tra kiểu:(a is! MyClass)
7. Hàm trong Dart
7.1 Khai báo
double tinhtong(double a, double b, double c) { return a + b + c; } // Hoặc double tinhtong(var a, var b, var c) => a + b + c; // Hoặc double tinhtong(var a, double b, double c) => a + b + c; // Gọi hàm var x = tinhtong(1, 2, 3)
7.2 Khai báo hàm với tham số mặc định
double tinhtong(var a, {double b:1, double c:2}) { return a + b + c; } var v1 = tinhtong(1); print(v1); //4.0 var v2 = tinhtong(1, c:10); print(v2); //12.0
7.3 Khai báo hàm với tham số tuỳ chọn
double tinhtong(var a, [double b, double c]) { var tong = a; if (b != null) tong += a; tong += (c!=null) ? c : 0; } print(tinhtong(1)); //1.0 print(tinhtong(1,2)); //3.0 print(tinhtong(1,2,3)); //6.0
7.4 Hàm ẩn danh lambda
hoặc closure
(var a, var b) => return a + b; // Hoặc (var a, var b) { return a + b; };
Để sử dụng ta có thể khai báo hàm và chạy luôn hoặc gán vào biến rồi dùng biến gọi hàm
//Khai báo xong chạy luôn var x = (var a, var b) { return a + b; }(5,6); print(x); //11
//Gán hàm ẩn danh vào biến ham, rồi dùng nó chạy var ham = (var a, var b) { return a + b; }; print(ham(10,11)); //21
Hàm ẩn danh rất tiện dụng để làm tham số (callback) trong các hàm khác, thậm chí khai báo luôn một ẩn danh ở tham số hàm
f1(var a, var b, var printmessage) { var c = a + b; printmessage(c); } f1(1, 2, (x) { print('Tổng là: $x');}); //Tổng là: 3 f1(1, 2, (z) => print('SUM = $z')); //SUM = 3
8. Class trong Dart
Class trong Dart rất giống với Java. Tôi bổ sung 1 số điểm khác như sau.
8.1 Mixin
Mixin là một lớp, nó không được sử dụng trực tiếp để tạo ra đối tượng. Một Mixin chứa các phương thức, thuộc tính dùng để gộp vào một lớp khác, sử dụng từ khoá with
và không mang ý nghĩa kế thừa.
class B { String name = 'B'; void displayInfomation() { print(name); } } mixin M { var var1 = null; showSomething() { print('Print message ...'); } } class C extends B with M { @override String name = 'C'; @override void displayInfomation() { print("My name is $name"); } }
8.2 Toán tử cascade ..
Khi bạn có một chuỗi tác vụ trên đối tượng (gọi phương thức, thiết lập thuộc tính) thay vì phải viết đầy đủ đối tượng thì bạn chỉ cần viết nó một lần, các tương tác tiếp theo thay thế bằng ..
var table = new Table(1); table ..calulateTotal() //Thay cho table.calulateTotal(); ..length=100 //Thay cho table.length=100; ..name='Abc' ..quantity=100 ..showTotal();
Lời kết
Trên đây là một số ghi chú cơ bản tôi tổng hợp được trong quá trình tìm hiểu về ngôn ngữ Dart. Nếu có phần nào đó không được chính xác rất mong bạn đọc để lại comment trao đổi thêm.
Chúc các bạn vui vẻ.
Tham khảo:
https://flutter.dev/
https://www.udemy.com/course/flutter-bootcamp-with-dart/
https://xuanthulab.net/lap-trinh-dart-flutter/
https://codelabs.developers.google.com/codelabs/from-java-to-dart#0
https://magenest.com/vi/flutter-la-gi/
https://dartpad.dev/?null_safety=true