Lập Trình Ứng Dụng Mobile Với Dart Và Flutter (P2)

Lập Trình Ứng Dụng Mobile Với Dart Và Flutter (P2)

Ngôn ngữ lập trình Dart – 1 ngôn ngữ đơn giản, dễ tiếp cận và cũng dễ hiểu. Trong phần 1 mình đã giới thiệu về Dart và cách cài đặt. Ở bài viết này mình và các bạn sẽ cùng nhau tìm hiểu sâu hơn về các hàm, biến, thư viện, ... trong Dart nhé.

Dart là gì ? Tại sao lại chọn Dart ? Nó có những ưu điểm nào ?

Dart là gì ?

Dart là ngôn ngữ lập trình đa mục đích được phát triển bởi Google và sau đó được ECMA phê chuẩn. Dart là một ngôn ngữ lập trình hướng đối tượng, là ngôn ngữ mã nguồn mở và miễn phí.

Tại sao lại chọn Dart ?

Ahead Of Time (AOT): Với AOT thì trình biên dịch chuyển ngôn ngữ Dart thẳng sang Native Code giúp hiệu năng tốt nhất có thể (tức là khi chạy chương trình, nó sẽ biên dịch từ đầu đến cuối)

Just In Time (JIT): Còn với JIT cho phép hot reloading hoạt động, giúp phát triển sản phẩm nhanh và tiện dụng hơn (được hiểu như việc debug trong ngôn ngữ khác là debug hàm nào chạy hàm đó thì ở đây nó sẽ viết đến đâu biên dịch ngay đến đấy)

Nó có ưu điểm nào ?

Năng suất Cú pháp Dart rõ ràng và súc tích, công cụ của nó đơn giản nhưng mạnh mẽ. Type-safe giúp bạn xác định sớm các lỗi tinh tế. Dart có các thư viện cốt lõi và một hệ sinh thái gồm hàng ngàn package.

Nhanh Dart cung cấp tối ưu hóa việc biên dịch trước thời hạn để có được dự đoán hiệu suất cao và khởi động nhanh trên các thiết bị di động và web.

Di động Dart biên dịch thành mã ARM và x86, để các ứng dụng di động của Dart có thể chạy tự nhiên trên iOS, Android và hơn thế nữa. Đối với các ứng dụng web, chuyển mã từ Dart sang JavaScript.

Dễ gần Dart quen thuộc với nhiều nhà phát triển hiện có, nhờ vào cú pháp và định hướng đối tượng không gây ngạc nhiên của nó. Nếu bạn đã biết C ++, C # hoặc Java, bạn có thể làm việc hiệu quả với Dart chỉ sau vài ngày.

Hello World

Mở đầu bài viết về ngôn ngữ thì chúng ta đã quá quen thuộc với ứng dụng Hello World đầu tiên. Mình sẽ viết cú pháp in ra dòng chữ Hello World sử dụng Editor Online là DartPad ( https://dartpad.dev/)

Mỗi ứng dụng đều có 1 hàm main() đóng vài trò là điểm vào đầu tiên của ứng dụng và để hiển thị văn bản trên console dùng hàm print() như sau :

Variables - Các biến thường dùng

  • String - thao tác với chuỗi và kí tự, đơn vị mã UTF-16, có thể sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép để tạo chuỗi.
String name = 'Dart Language';
  • num - thao tác với số.
num number = 24;
num number1 = 24.24;
  • int - để thao tác với số nguyên.
  • double - để thao tác với số thập phân.
  • bool - khai báo biến Boolean.
bool isCheckTrue = true;
bool isCheckFalse = false;
  • const - khai báo biến hằng số.
const int id = 24;
  • dynamic - có thể dùng để khai báo cả chuỗi, số, boolean.
dynamic name = 'Dart Language';
dynamic age = 24;
dynamic isHandsome = true;
  • var - để khai báo biến khi chưa biết là chuỗi hay số, không thể dùng để khai báo kiểu trả về của hàm.
var text = 'hello dart language';
  • Runes - để sử dụng các emoji.
Runes input = new Runes(' \u{1f605} '); 
print(new String.fromCharCodes(input)); 

*** Tất cả biến trong Dart đều không phải là dạng nguyên thủy nó đều là đối tượng ***

Control flow statements

  • assert(conditionoptionalMessage) - ngắt 1 thực thi thông thường khi điều kiện trả về sai. Nếu giá trị biểu thức là đúng, xác nhận thành công và tiếp tục thực hiện. Nếu sai, xác nhận thất bại và 1 ngoại lệ được ném ra.
// Biến text có giá trị khác null
assert(text != null);

// Biến number nhỏ hơn 100
assert(number < 100);

// UrlString sẽ trả về chuỗi bắt đầu với https
assert(urlString.startsWith('https'));
  • if else - biểu thức điều kiện, sử dụng để điều hướng.
if(condition) {
 // do something
} else {
 // do another
}
  • switch case - như mọi ngôn ngữ khác, cũng sử dụng để điều hướng.
var condition;
switch(condition) {
 case decision:
 	// do something;
 	break;
 case decison1: 
 	// do another thing;
 	break;
 default:
 	// do default result;
 	break;
  • Loop - vòng lặp.
while(condition) {
 // do something
}
do {
 // do something
} while(condition);
List alphabets = ['alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta'];
 
// for with index
for(int i = 0; i < alphabets.length; i++) {
 // do something
}
 
// for each item
for(var word in alphabets) {
 // do something
}
 
alphabets.forEach((String item) {
 // do something
});

Functions

Basic function - Dart là ngôn ngữ hướng đối tượng, hàm trong Dart cũng là một object và có một kiểu dữ liệu cho nó. Điều đó có nghĩa là có thể gán 1 function cho 1 biến hoặc dùng nó làm đối số (argument) cho 1 hàm khác.

 bool isYourName(String name) {
 	return name == 'Dart Language';
 }
  • Nếu không khai báo kiểu dữ liệu thì sẽ mặc định là void hoặc tùy vào kết quả trả về của hàm.
 isYourName(String name) {
 	return name == 'Dart Language';
 }
  • Để rút gọn thì ta nên dùng cú pháp => đối với hàm không có block code.
isYourName(String name) => name == 'Dart Language';

Optional parameter function 

  • Named parameters

* Khi gọi 1 hàm, bạn có thể chỉ định các tham số được đặt tên bằng paramName.

enableFlags(bold: true, hidden: false);

* Khi xác định hàm, xử dụng {param1param2, …} để chỉ định tham số đã đặt tên.

void enableFlags({bool bold, bool hidden}) {...}

* Từ khóa required : chỉ định tham số bắt buộc.

const Scrollbar({Key key, @required Widget child})
  • Positional parameters

* Các tham số được đặt trong dấu [] thì chúng là tham số tùy chọn.

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

* Gọi hàm khi không có tham số tùy chọn.

assert(say('Bob', 'Howdy') == 'Bob says Howdy');

* Gọi hàm khi có tham số tùy chọn thứ 3

assert(say('Bob', 'Howdy', 'smoke signal') ==
    'Bob says Howdy with a smoke signal');
  • Default parameter values : sử dụng dấu = để xác định giá trị mặc định cho tham số
void enableFlags({bool bold = false, bool hidden = false}) {...}

enableFlags(bold: true);

Anonymous functions

Hầu hết các hàm đều có tên, chẳng hạn như hàm main(). Bạn cũng có thể gọi 1 hàm không tên, gọi là hàm ẩn danh (anonymous function) . Nó được khởi tạo lúc chạy runtime, nó có thể gán cho 1 biến hoặc gọi 1 hàm khác.

var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
  print('${list.indexOf(item)}: $item');
});

Comments

Single-line comments : comment 1 dòng

void main() {
  // TODO: Comment 1 dòng ở đây
  print('Welcome to Dart Language!');
}

Multi-line comments : comment nhiều dòng

void main() {
  /*
   * Comment nhiều dòng
   */
}

Libraries

  • Một thư viện có thể chứa tập hợp các lớp, hàm, hằng ... để bạn nạp vào và sử dụng khi cần thiết.
  • Trong Dart để nạp thư viện bạn dùng từ khóa import ở đầu file. Với cú pháp:
import 'uri';
  • Nếu chỉ nạp một phần nào đó của thư viện sử dụng thêm từ khóa show có dạng :
import 'uri' show uri1, uri2, uri3;
  • Khi nạp thư viện, để tránh xung đột về tên, bạn cũng có thể đặt lại bằng as.
  • Dart cũng có trình quản lý gói package riêng là pub (nó giống NPM của NodeJS, giống Nuget của .Net, Gradle của Java ...).

Tổng kết

Ở bài viết này, mình đã giới thiệu cho các bạn về các nội dung cơ bản khi các bạn khởi đầu với 1 ngôn ngữ lập trình Dart. Ở bài tiếp theo, mình sẽ tiếp tục nói về ngôn ngữ Dart với nội dung : Classes, OOP, Async, Exception và 1 số topic khác. Hi vọng các bạn sẽ tiếp tục đón nhận kiến thức mình đã chia sẻ. Tham gia góp ý cùng mình với nhé để mình có động lực viết ra được 1 series chi tiết về Flutter và Dart.

Cảm ơn mọi người đã xem bài viết của mình !!!

Tài liệu tham khảo: dart.dev