Lập trình Dart - Hướng dẫn nhanh
Dart là một ngôn ngữ hướng đối tượng với cú pháp kiểu C có thể tùy chọn chuyển biên dịch sang JavaScript. Nó hỗ trợ một loạt các công cụ hỗ trợ lập trình như giao diện, lớp, bộ sưu tập, số liệu chung và kiểu gõ tùy chọn.
Dart có thể được sử dụng rộng rãi để tạo các ứng dụng một trang. Ứng dụng một trang chỉ áp dụng cho các trang web và ứng dụng web. Các ứng dụng một trang cho phép điều hướng giữa các màn hình khác nhau của trang web mà không cần tải một trang web khác trong trình duyệt. Một ví dụ cổ điển làGMail ─ khi bạn nhấp vào một thư trong hộp thư đến của mình, trình duyệt vẫn ở trên cùng một trang web, nhưng mã JavaScript sẽ ẩn hộp thư đến và hiển thị nội dung thư trên màn hình.
Google đã phát hành một phiên bản đặc biệt của Chromium - các Dart VM. Sử dụng Dartium có nghĩa là bạn không phải biên dịch mã của mình sang JavaScript cho đến khi bạn sẵn sàng thử nghiệm trên các trình duyệt khác.
Bảng sau so sánh các tính năng của Dart và JavaScript.
Đặc tính | Phi tiêu | JavaScript |
---|---|---|
Loại hệ thống | Tùy chọn, động | Yếu, năng động |
Các lớp học | Có, thừa kế duy nhất | Nguyên mẫu |
Giao diện | Có, nhiều giao diện | Không |
Đồng tiền | Có, với các phân lập | Có, với nhân viên web HTML5 |
Hướng dẫn này cung cấp hiểu biết cơ bản về ngôn ngữ lập trình Dart.
Chương này thảo luận về việc thiết lập môi trường thực thi cho Dart trên nền tảng Windows.
Thực thi Script trực tuyến với DartPad
Bạn có thể kiểm tra tập lệnh của mình trực tuyến bằng cách sử dụng trình chỉnh sửa trực tuyến tại https://dartpad.dartlang.org/. Dart Editor thực thi tập lệnh và hiển thị cả HTML cũng như đầu ra bảng điều khiển. Trình chỉnh sửa trực tuyến được cung cấp cùng với một tập hợp các mẫu mã đặt trước.
Ảnh chụp màn hình của Dartpad trình soạn thảo được cung cấp bên dưới -
Dartpad cũng cho phép viết mã theo cách hạn chế hơn. Điều này có thể đạt được bằng cách chọn tùy chọn Chế độ mạnh ở phía dưới bên phải của trình chỉnh sửa. Chế độ mạnh giúp -
- Kiểm tra tĩnh và động mạnh hơn
- Tạo mã JavaScript tự động để có khả năng tương tác tốt hơn.
Bạn có thể thử ví dụ sau bằng Dartpad
void main() {
print('hello world');
}
Mã sẽ hiển thị đầu ra sau
hello world
Thiết lập môi trường cục bộ
Trong phần này, chúng ta hãy xem cách thiết lập môi trường cục bộ.
Sử dụng Trình soạn thảo Văn bản
Ví dụ về một số trình chỉnh sửa bao gồm Windows Notepad, Notepad ++, Emacs, vim hoặc vi, v.v. Các trình chỉnh sửa có thể khác nhau từ Hệ điều hành này sang Hệ điều hành khác. Các tệp nguồn thường được đặt tên với phần mở rộng là ".dart".
Cài đặt Dart SDK
Phiên bản ổn định hiện tại của Dart là 1.21.0. Cácdart sdk có thể được tải xuống từ -
https://www.dartlang.org/install/archive
http://www.gekorm.com/dart-windows/
Dưới đây là ảnh chụp màn hình cài đặt Dart SDK:
Sau khi hoàn tất cài đặt SDK, hãy đặt biến môi trường PATH thành -
<dart-sdk-path>\bin
Xác minh cài đặt
Để xác minh xem Dart đã được cài đặt thành công hay chưa, hãy mở dấu nhắc lệnh và nhập lệnh sau:
Dart
Nếu cài đặt thành công, nó sẽ hiển thị thời gian chạy phi tiêu.
Hỗ trợ IDE
Rất nhiều IDE hỗ trợ tập lệnh trong Dart. Những ví dụ bao gồmEclipse, IntelliJvà WebStorm từ bộ não máy bay phản lực.
Dưới đây là các bước để định cấu hình môi trường Dart bằng cách sử dụng WebStrom IDE.
Cài đặt WebStorm
Tệp cài đặt cho WebStorm có thể được tải xuống từ https://www.jetbrains.com/webstorm/download/#section=windows-version.
Tệp cài đặt WebStorm có sẵn cho Mac OS, Windows và Linux.
Sau khi tải xuống tệp cài đặt, hãy làm theo các bước dưới đây:
Cài đặt Dart SDK: Tham khảo các bước được liệt kê ở trên
Tạo một dự án Dart mới và định cấu hình hỗ trợ Dart
Để tạo một dự án Dart mới,
Nhấp chuột Create New Project từ Màn hình Chào mừng
Trong hộp thoại tiếp theo, nhấp vào Dart
Nếu không có giá trị được chỉ định cho Dart SDK, sau đó cung cấp đường dẫn SDK. Ví dụ: đường dẫn SDK có thể là<dart installation directory>/dart/dartsdk.
Thêm tệp Dart vào dự án
Để thêm tệp Dart vào Dự án -
- Nhấp chuột phải vào Dự án
- Mới → Tệp Dart
- Nhập tên của Dart Script
Ảnh chụp màn hình của Trình chỉnh sửa WebStorm được đưa ra dưới đây:
Công cụ dart2js
Các dart2jscông cụ biên dịch mã Dart sang JavaScript. Biên dịch mã Dart sang JS cho phép chạy tập lệnh Dart trên các trình duyệt không hỗ trợ Dart VM.
Công cụ dart2js được vận chuyển như một phần của SDK Dart và có thể được tìm thấy trong /dartsdk/bin folder.
Để biên dịch Dart sang JavaScript, hãy nhập lệnh sau vào terminal
dart2js - - out = <output_file>.js <dart_script>.dart
Lệnh này tạo ra một tệp chứa JavaScript tương đương với mã Dart của bạn. Bạn có thể tìm thấy hướng dẫn đầy đủ về cách sử dụng tiện ích này trên trang web chính thức của Dart.
Cú pháp xác định một tập hợp các quy tắc để viết chương trình. Mỗi đặc tả ngôn ngữ xác định cú pháp riêng của nó. Chương trình A Dart bao gồm -
- Biến và toán tử
- Classes
- Functions
- Biểu thức và cấu trúc lập trình
- Ra quyết định và xây dựng vòng lặp
- Comments
- Thư viện và Gói
- Typedefs
- Cấu trúc dữ liệu được biểu thị dưới dạng Tập hợp / Chung
Mã phi tiêu đầu tiên của bạn
Chúng ta hãy bắt đầu với ví dụ “Hello World” truyền thống -
main() {
print("Hello World!");
}
Các main()hàm là một phương thức được xác định trước trong Dart. Phương thức này đóng vai trò là điểm vào ứng dụng. Tập lệnh Dart cầnmain() phương pháp thực hiện. print() là một hàm được xác định trước để in chuỗi hoặc giá trị được chỉ định ra đầu ra tiêu chuẩn tức là thiết bị đầu cuối.
Đầu ra của đoạn mã trên sẽ là:
Hello World!
Thực hiện một chương trình phi tiêu
Bạn có thể thực thi chương trình Dart theo hai cách:
- Qua nhà ga
- Qua IDE WebStorm
Qua nhà ga
Để thực hiện chương trình Dart qua thiết bị đầu cuối -
- Điều hướng đến đường dẫn của dự án hiện tại
- Gõ lệnh sau vào cửa sổ Terminal
dart file_name.dart
Qua IDE WebStorm
Để thực thi chương trình Dart thông qua IDE WebStorm -
Bấm chuột phải vào tệp kịch bản Dart trên IDE. (Tệp phải chứamain() chức năng cho phép thực thi)
Bấm vào ‘Run <file_name>’Lựa chọn. Dưới đây là một ảnh chụp màn hình tương tự -
Một cách khác có thể nhấp vào
Tùy chọn dòng lệnh Dart
Tùy chọn dòng lệnh Dart được sử dụng để sửa đổi việc thực thi Dart Script. Các tùy chọn dòng lệnh phổ biến cho Dart bao gồm:
Sr.No | Tùy chọn & Mô tả Dòng lệnh |
---|---|
1 | -c or --c Cho phép cả xác nhận và kiểm tra loại (chế độ đã kiểm tra). |
2 | --version Hiển thị thông tin phiên bản VM. |
3 | --packages <path> Chỉ định đường dẫn đến tệp cấu hình độ phân giải gói. |
4 | -p <path> Chỉ định nơi để tìm các thư viện đã nhập. Không thể sử dụng tùy chọn này với --packages. |
5 | -h or --help Hiển thị trợ giúp. |
Bật chế độ đã kiểm tra
Các chương trình phi tiêu chạy ở hai chế độ:
- Chế độ đã kiểm tra
- Chế độ sản xuất (Mặc định)
Bạn nên chạy máy ảo Dart trong checked modetrong quá trình phát triển và thử nghiệm, vì nó thêm các cảnh báo và lỗi để hỗ trợ quá trình phát triển và gỡ lỗi. Chế độ đã kiểm tra thực thi các kiểm tra khác nhau như kiểm tra kiểu, v.v. Để bật chế độ đã kiểm tra, hãy thêm tùy chọn -c hoặc –-checked trước tên tệp tập lệnh trong khi chạy tập lệnh.
Tuy nhiên, để đảm bảo lợi ích về hiệu suất trong khi chạy tập lệnh, bạn nên chạy tập lệnh trong production mode.
Hãy xem xét những điều sau Test.dart tập lệnh -
void main() {
int n = "hello";
print(n);
}
Chạy tập lệnh bằng cách nhập -
dart Test.dart
Mặc dù có kiểu không khớp nhưng tập lệnh vẫn thực thi thành công khi chế độ đã chọn bị tắt. Tập lệnh sẽ dẫn đến kết quả sau:
hello
Bây giờ hãy thử thực thi tập lệnh với tùy chọn "- - đã chọn" hoặc "-c" -
dart -c Test.dart
Hoặc là,
dart - - checked Test.dart
Máy ảo Dart sẽ xuất hiện một lỗi thông báo rằng có kiểu không khớp.
Unhandled exception:
type 'String' is not a subtype of type 'int' of 'n' where
String is from dart:core
int is from dart:core
#0 main (file:///C:/Users/Administrator/Desktop/test.dart:3:9)
#1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart :261)
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Số nhận dạng trong Dart
Số nhận dạng là tên được đặt cho các phần tử trong một chương trình như biến, hàm, v.v. Các quy tắc cho số nhận dạng là:
Số nhận dạng có thể bao gồm cả hai, ký tự và chữ số. Tuy nhiên, số nhận dạng không thể bắt đầu bằng một chữ số.
Số nhận dạng không được bao gồm các ký hiệu đặc biệt ngoại trừ dấu gạch dưới (_) hoặc dấu đô la ($).
Số nhận dạng không được là từ khóa.
Chúng phải là duy nhất.
Số nhận dạng có phân biệt chữ hoa chữ thường.
Số nhận dạng không được chứa khoảng trắng.
Các bảng sau liệt kê một số ví dụ về số nhận dạng hợp lệ và không hợp lệ:
Số nhận dạng hợp lệ | Số nhận dạng không hợp lệ |
---|---|
tên đầu tiên | Var |
tên đầu tiên | tên đầu tiên |
num1 | tên đầu tiên |
$ kết quả | 1 số |
Từ khóa trong Dart
Từ khóa có một ý nghĩa đặc biệt trong ngữ cảnh của một ngôn ngữ. Bảng sau liệt kê một số từ khóa trong Dart.
tóm tắt 1 | tiếp tục | sai | Mới | điều này |
như 1 | mặc định | sau cùng | vô giá trị | phi |
khẳng định | hoãn lại 1 | cuối cùng | toán tử 1 | thật |
async 2 | làm | cho | phần 1 | thử |
async * 2 | động 1 | nhận được 1 | mọc lại | typedef 1 |
chờ đợi 2 | khác | nếu | trở về | var |
phá vỡ | enum | thực hiện 1 | Hiệp 1 | vô hiệu |
trường hợp | xuất 1 | nhập 1 | tĩnh 1 | trong khi |
nắm lấy | bên ngoài 1 | trong | siêu | với |
lớp học | kéo dài | Là | công tắc điện | năng suất 2 |
hăng sô | nhà máy 1 | thư viện 1 | đồng bộ * 2 | năng suất * 2 |
Khoảng trắng và ngắt dòng
Dart bỏ qua khoảng trắng, tab và dòng mới xuất hiện trong chương trình. Bạn có thể sử dụng các khoảng trắng, tab và dòng mới một cách thoải mái trong chương trình của mình và bạn có thể tự do định dạng và thụt lề chương trình của mình theo cách gọn gàng và nhất quán giúp mã dễ đọc và dễ hiểu.
Dart phân biệt chữ hoa chữ thường
Dart phân biệt chữ hoa chữ thường. Điều này có nghĩa là Dart phân biệt giữa các ký tự viết hoa và viết thường.
Các câu lệnh kết thúc bằng Dấu chấm phẩy
Mỗi dòng lệnh được gọi là một câu lệnh. Mỗi câu lệnh dart phải kết thúc bằng dấu chấm phẩy (;). Một dòng duy nhất có thể chứa nhiều câu lệnh. Tuy nhiên, các câu lệnh này phải được phân tách bằng dấu chấm phẩy.
Nhận xét trong Dart
Nhận xét là một cách để cải thiện khả năng đọc của chương trình. Nhận xét có thể được sử dụng để bao gồm thông tin bổ sung về một chương trình như tác giả của mã, gợi ý về một hàm / cấu trúc, v.v. Nhận xét bị trình biên dịch bỏ qua.
Dart hỗ trợ các loại nhận xét sau:
Single-line comments ( // ) - Bất kỳ văn bản nào giữa "//" và cuối dòng được coi là nhận xét
Multi-line comments (/* */) - Những bình luận này có thể kéo dài nhiều dòng.
Thí dụ
// this is single line comment
/* This is a
Multi-line comment
*/
Lập trình hướng đối tượng trong Dart
Dart là một ngôn ngữ hướng đối tượng. Định hướng đối tượng là một mô hình phát triển phần mềm theo mô hình thế giới thực. Hướng đối tượng coi một chương trình là một tập hợp các đối tượng giao tiếp với nhau thông qua cơ chế gọi là các phương thức.
Object- Một đối tượng là một đại diện thời gian thực của bất kỳ thực thể nào. Theo Grady Brooch, mọi vật thể phải có ba đặc điểm:
State - được mô tả bởi các thuộc tính của một đối tượng.
Behavior - mô tả đối tượng sẽ hành động như thế nào.
Identity - một giá trị duy nhất để phân biệt một đối tượng với một tập hợp các đối tượng tương tự như vậy.
Class- Một lớp về mặt OOP là một bản thiết kế để tạo các đối tượng. Một lớp đóng gói dữ liệu cho đối tượng.
Method - Phương pháp tạo điều kiện giao tiếp giữa các đối tượng.
Ví dụ: Phi tiêu và Hướng đối tượng
class TestClass {
void disp() {
print("Hello World");
}
}
void main() {
TestClass c = new TestClass();
c.disp();
}
Ví dụ trên định nghĩa một lớp TestClass. Lớp có một phương thứcdisp(). Phương thức in chuỗi “Hello World” trên thiết bị đầu cuối. Từ khóa mới tạo một đối tượng của lớp. Đối tượng gọi phương thứcdisp().
Mã sẽ tạo ra những điều sau output -
Hello World
Một trong những đặc điểm cơ bản nhất của ngôn ngữ lập trình là tập hợp các kiểu dữ liệu mà nó hỗ trợ. Đây là những loại giá trị có thể được biểu diễn và thao tác trong một ngôn ngữ lập trình.
Ngôn ngữ Dart hỗ trợ các loại sau:
- Numbers
- Strings
- Booleans
- Lists
- Maps
Số
Các số trong Dart được sử dụng để biểu thị các ký tự số. Number Dart có hai hương vị -
Integer- Giá trị số nguyên đại diện cho các giá trị không thuộc phân số, tức là các giá trị số không có dấu thập phân. Ví dụ, giá trị "10" là một số nguyên. Các ký tự số nguyên được biểu diễn bằng cách sử dụngint từ khóa.
Double- Dart cũng hỗ trợ các giá trị số phân số tức là các giá trị có dấu thập phân. Kiểu dữ liệu Double trong Dart đại diện cho số dấu phẩy động 64 bit (độ chính xác kép). Ví dụ: giá trị "10.10". Từ khóadouble được sử dụng để biểu diễn các ký tự dấu phẩy động.
Dây
Chuỗi đại diện cho một chuỗi ký tự. Ví dụ: nếu bạn lưu trữ một số dữ liệu như tên, địa chỉ, v.v. thì kiểu dữ liệu chuỗi sẽ được sử dụng. Chuỗi Dart là một chuỗi các đơn vị mã UTF-16.Runes được sử dụng để đại diện cho một chuỗi các đơn vị mã UTF-32.
Từ khóa Stringđược sử dụng để biểu diễn các ký tự chuỗi. Giá trị chuỗi được nhúng trong dấu ngoặc kép hoặc đơn.
Boolean
Kiểu dữ liệu Boolean đại diện cho các giá trị Boolean đúng và sai. Dart sử dụngbool từ khóa đại diện cho một giá trị Boolean.
Danh sách và Bản đồ
Bản đồ và danh sách kiểu dữ liệu được sử dụng để thể hiện một tập hợp các đối tượng. AListlà một nhóm đối tượng có thứ tự. Kiểu dữ liệu List trong Dart đồng nghĩa với khái niệm mảng trong các ngôn ngữ lập trình khác. CácMapkiểu dữ liệu đại diện cho một tập hợp các giá trị dưới dạng các cặp khóa-giá trị. Cácdart: core thư viện cho phép tạo và thao tác các tập hợp này thông qua các lớp Danh sách và Bản đồ được xác định trước tương ứng.
Loại động
Dart là một ngôn ngữ nhập tùy chọn. Nếu kiểu của một biến không được chỉ định rõ ràng, kiểu của biến làdynamic. Cácdynamic từ khóa cũng có thể được sử dụng như một loại chú thích rõ ràng.
Một biến là "một không gian được đặt tên trong bộ nhớ" để lưu trữ các giá trị. Nói cách khác, nó hoạt động một vùng chứa các giá trị trong một chương trình. Tên biến được gọi là định danh. Sau đây là các quy tắc đặt tên cho một số nhận dạng:
Số nhận dạng không được là từ khóa.
Số nhận dạng có thể chứa bảng chữ cái và số.
Số nhận dạng không được chứa khoảng trắng và ký tự đặc biệt, ngoại trừ dấu gạch dưới (_) và ký hiệu đô la ($).
Tên biến không được bắt đầu bằng số.
Nhập cú pháp
Một biến phải được khai báo trước khi nó được sử dụng. Dart sử dụng từ khóa var để đạt được điều tương tự. Cú pháp khai báo một biến như sau:
var name = 'Smith';
Tất cả các biến trong dart lưu trữ một tham chiếu đến giá trị thay vì chứa giá trị. Biến được gọi là tên chứa tham chiếu đến đối tượng Chuỗi có giá trị là “Smith”.
Hỗ trợ phi tiêu type-checkingbằng cách đặt trước tên biến với kiểu dữ liệu. Kiểm tra kiểu đảm bảo rằng một biến chỉ chứa dữ liệu cụ thể cho một kiểu dữ liệu. Cú pháp tương tự được đưa ra dưới đây:
String name = 'Smith';
int num = 10;
Hãy xem xét ví dụ sau:
void main() {
String name = 1;
}
Đoạn mã trên sẽ dẫn đến cảnh báo vì giá trị được chỉ định cho biến không khớp với kiểu dữ liệu của biến.
Đầu ra
Warning: A value of type 'String' cannot be assigned to a variable of type 'int'
Tất cả các biến chưa được khởi tạo đều có giá trị ban đầu là null. Điều này là do Dart coi tất cả các giá trị là đối tượng. Ví dụ sau minh họa tương tự -
void main() {
int num;
print(num);
}
Đầu ra
Null
Từ khóa động
Các biến được khai báo không có kiểu tĩnh được khai báo ngầm là động. Các biến cũng có thể được khai báo bằng cách sử dụng từ khóa động thay cho từ khóa var.
Ví dụ sau đây minh họa tương tự.
void main() {
dynamic x = "tom";
print(x);
}
Đầu ra
tom
Final và Const
Các final và consttừ khóa được sử dụng để khai báo các hằng số. Dart ngăn việc sửa đổi các giá trị của một biến được khai báo bằng từ khóa final hoặc const. Những từ khóa này có thể được sử dụng cùng với kiểu dữ liệu của biến hoặc thay vìvar từ khóa.
Các consttừ khóa được sử dụng để đại diện cho một hằng số thời gian biên dịch. Các biến được khai báo bằng cách sử dụngconst từ khóa hoàn toàn là cuối cùng.
Cú pháp: Từ khóa cuối cùng
final variable_name
HOẶC LÀ
final data_type variable_name
Cú pháp: const Keyword
const variable_name
HOẶC LÀ
const data_type variable_name
Ví dụ - Từ khóa cuối cùng
void main() {
final val1 = 12;
print(val1);
}
Đầu ra
12
Ví dụ - Từ khóa const
void main() {
const pi = 3.14;
const area = pi*12*12;
print("The output is ${area}");
}
Ví dụ trên khai báo hai hằng số, pi và area, sử dụng consttừ khóa. Cácarea giá trị của biến là một hằng số thời gian biên dịch.
Đầu ra
The output is 452.15999999999997
Note - Chỉ constcác biến có thể được sử dụng để tính hằng số thời gian biên dịch. Hằng số thời gian biên dịch là hằng số có giá trị sẽ được xác định tại thời điểm biên dịch
Thí dụ
Dart ném ra một ngoại lệ nếu cố gắng sửa đổi các biến được khai báo với finalhoặc từ khóa const. Ví dụ dưới đây minh họa tương tự -
void main() {
final v1 = 12;
const v2 = 13;
v2 = 12;
}
Đoạn mã được đưa ra ở trên sẽ gây ra lỗi sau là output -
Unhandled exception:
cannot assign to final variable 'v2='.
NoSuchMethodError: cannot assign to final variable 'v2='
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:178)
#1 main (file: Test.dart:5:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Biểu thức là một loại câu lệnh đặc biệt đánh giá một giá trị. Mọi biểu thức đều bao gồm -
Operands - Đại diện cho dữ liệu
Operator - Xác định cách các toán hạng sẽ được xử lý để tạo ra một giá trị.
Hãy xem xét biểu thức sau - "2 + 3". Trong biểu thức này, 2 và 3 làoperands và ký hiệu "+" (dấu cộng) là operator.
Trong chương này, chúng ta sẽ thảo luận về các toán tử có sẵn trong Dart.
- Toán tử số học
- Các toán tử bình đẳng và quan hệ
- Kiểm tra kiểu Người vận hành
- Toán tử Bitwise
- Người điều hành nhiệm vụ
- Toán tử logic
Toán tử số học
Bảng sau đây cho thấy các toán tử số học được hỗ trợ bởi Dart.
Hiển thị các ví dụ
Sr.No | Toán tử & Ý nghĩa |
---|---|
1 | + Thêm vào |
2 | − Trừ đi |
3 | -expr Trừ một bậc, còn được gọi là phủ định (đảo ngược dấu của biểu thức) |
4 | * nhân |
5 | / Chia |
6 | ~/ Chia, trả về một kết quả số nguyên |
7 | % Nhận phần còn lại của một phép chia số nguyên (modulo) |
số 8 | ++ Tăng |
9 | -- Giảm dần |
Các toán tử bình đẳng và quan hệ
Toán tử quan hệ kiểm tra hoặc xác định kiểu quan hệ giữa hai thực thể. Các toán tử quan hệ trả về giá trị Boolean tức là true / false.
Giả sử giá trị của A là 10 và B là 20.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Thí dụ |
---|---|---|
> | Lớn hơn | (A> B) là Sai |
< | Ít hơn | (A <B) là True |
> = | Lớn hơn hoặc bằng | (A> = B) là Sai |
<= | Nhỏ hơn hoặc bằng | (A <= B) là True |
== | Bình đẳng | (A == B) là Sai |
! = | Không công bằng | (A! = B) là True |
Kiểm tra kiểu Người vận hành
Các toán tử này rất tiện lợi cho việc kiểm tra các loại trong thời gian chạy.
Hiển thị các ví dụ
Nhà điều hành | Ý nghĩa |
---|---|
Là | Đúng nếu đối tượng có kiểu được chỉ định |
Là! | Sai nếu đối tượng có kiểu được chỉ định |
Toán tử Bitwise
Bảng sau liệt kê các toán tử bitwise có sẵn trong Dart và vai trò của chúng:
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Thí dụ |
---|---|---|
Bitwise VÀ | a & b | Trả về một ở mỗi vị trí bit mà các bit tương ứng của cả hai toán hạng là một. |
Bitwise HOẶC | a | b | Trả về một ở mỗi vị trí bit mà các bit tương ứng của một trong hai hoặc cả hai toán hạng là một. |
Bitwise XOR | a ^ b | Trả về một ở mỗi vị trí bit mà các bit tương ứng của một trong hai nhưng không phải cả hai toán hạng đều là một. |
Bitwise KHÔNG | ~ a | Đảo ngược các bit của toán hạng của nó. |
Dịch trái | a ≪ b | Dịch chuyển a trong biểu diễn nhị phân b (<32) bit sang bên trái, dịch chuyển theo số 0 từ bên phải. |
Dịch chuyển bên phải ký hiệu ký hiệu | a ≫ b | Dịch chuyển a trong biểu diễn nhị phân b (<32) bit sang phải, loại bỏ các bit bị dịch chuyển. |
Người điều hành nhiệm vụ
Bảng sau liệt kê các toán tử gán có sẵn trong Dart.
Hiển thị các ví dụ
Sr.No | Nhà điều hành & Mô tả |
---|---|
1 | =(Simple Assignment ) Gán các giá trị từ toán hạng bên phải cho toán hạng bên trái Ex: C = A + B sẽ gán giá trị của A + B vào C |
2 | ??= Chỉ gán giá trị nếu biến là rỗng |
3 | +=(Add and Assignment) Nó thêm toán hạng bên phải vào toán hạng bên trái và gán kết quả cho toán hạng bên trái. Ex: C + = A tương đương với C = C + A |
4 | ─=(Subtract and Assignment) Nó trừ toán hạng bên phải khỏi toán hạng bên trái và gán kết quả cho toán hạng bên trái. Ex: C - = A tương đương với C = C - A |
5 | *=(Multiply and Assignment) Nó nhân toán hạng bên phải với toán hạng bên trái và gán kết quả cho toán hạng bên trái. Ex: C * = A tương đương với C = C * A |
6 | /=(Divide and Assignment) Nó chia toán hạng bên trái với toán hạng bên phải và gán kết quả cho toán hạng bên trái. |
Note - Logic tương tự áp dụng cho các toán tử Bitwise, vì vậy chúng sẽ trở thành ≪ =, ≫ =, ≫ =, ≫ =, | = và ^ =.
Toán tử logic
Toán tử logic được sử dụng để kết hợp hai hoặc nhiều điều kiện. Các toán tử logic trả về giá trị Boolean. Giả sử giá trị của biến A là 10 và B là 20.
Hiển thị các ví dụ
Nhà điều hành | Sự miêu tả | Thí dụ |
---|---|---|
&& | And - Toán tử chỉ trả về true nếu tất cả các biểu thức được chỉ định trả về true |
(A> 10 && B> 10) là Sai. |
|| | OR - Toán tử trả về true nếu ít nhất một trong các biểu thức được chỉ định trả về true |
(A> 10 || B> 10) là True. |
! | NOT- Toán tử trả về giá trị nghịch đảo của kết quả của biểu thức. Ví dụ:! (7> 5) trả về false |
! (A> 10) là Đúng. |
Biểu thức có điều kiện
Dart có hai toán tử cho phép bạn đánh giá các biểu thức có thể yêu cầu các câu lệnh ifelse -
tình trạng ? expr1: expr2
Nếu điều kiện là đúng, thì biểu thức đánh giá expr1(và trả về giá trị của nó); nếu không, nó đánh giá và trả về giá trị củaexpr2.
expr1 ?? expr2
Nếu expr1là khác rỗng, trả về giá trị của nó; ngược lại, đánh giá và trả về giá trị củaexpr2
Thí dụ
Ví dụ sau cho thấy cách bạn có thể sử dụng biểu thức điều kiện trong Dart:
void main() {
var a = 10;
var res = a > 12 ? "value greater than 10":"value lesser than or equal to 10";
print(res);
}
Nó sẽ tạo ra kết quả sau:
value lesser than or equal to 10
Thí dụ
Hãy lấy một ví dụ khác -
void main() {
var a = null;
var b = 12;
var res = a ?? b;
print(res);
}
Nó sẽ tạo ra kết quả sau:
12
Đôi khi, một số hướng dẫn nhất định yêu cầu thực hiện lặp lại. Vòng lặp là một cách lý tưởng để làm điều tương tự. Một vòng lặp đại diện cho một tập hợp các lệnh phải được lặp lại. Trong ngữ cảnh của một vòng lặp, một sự lặp lại được gọi làiteration.
Hình sau minh họa sự phân loại của các vòng lặp:
Hãy bắt đầu cuộc thảo luận với Vòng lặp xác định. Một vòng lặp có số lần lặp là xác định / cố định được gọi làdefinite loop.
Sr.No | Vòng lặp & mô tả |
---|---|
1 | vòng lặp for Các forvòng lặp là một thực hiện của một vòng lặp xác định. Vòng lặp for thực thi khối mã trong một số lần xác định. Nó có thể được sử dụng để lặp qua một tập giá trị cố định, chẳng hạn như một mảng |
2 | cho… trong Vòng lặp Vòng lặp for ... in được sử dụng để lặp qua các thuộc tính của đối tượng. |
Tiếp tục, bây giờ chúng ta hãy thảo luận về các vòng lặp không xác định. Vòng lặp không xác định được sử dụng khi số lần lặp trong vòng lặp là không xác định hoặc không xác định. Các vòng lặp không giới hạn có thể được thực hiện bằng cách sử dụng -
Sr.No | Vòng lặp & mô tả |
---|---|
1 | trong khi lặp lại Vòng lặp while thực hiện các lệnh mỗi khi điều kiện được chỉ định đánh giá là true. Nói cách khác, vòng lặp đánh giá điều kiện trước khi khối mã được thực thi. |
2 | làm… trong khi Vòng lặp Vòng lặp do… while tương tự như vòng lặp while ngoại trừ vòng lặp do… while không đánh giá điều kiện lần đầu tiên vòng lặp thực thi. |
Bây giờ chúng ta hãy tiếp tục và thảo luận về Loop Control Statements của Dart.
Sr.No | Tuyên bố & Mô tả Kiểm soát |
---|---|
1 | tuyên bố break Các breakcâu lệnh được sử dụng để lấy điều khiển ra khỏi một cấu trúc. Sử dụngbreaktrong một vòng lặp khiến chương trình thoát khỏi vòng lặp. Sau đây là một ví dụ vềbreak tuyên bố. |
2 | tiếp tục Tuyên bố Các continue câu lệnh bỏ qua các câu lệnh tiếp theo trong vòng lặp hiện tại và đưa điều khiển trở lại phần đầu của vòng lặp. |
Sử dụng nhãn để kiểm soát luồng
A labelchỉ đơn giản là một định danh theo sau bởi dấu hai chấm (:) được áp dụng cho một câu lệnh hoặc một khối mã. Một nhãn có thể được sử dụng vớibreak và continue để kiểm soát dòng chảy chính xác hơn.
Không được phép ngắt dòng giữa ‘continue’ hoặc là ‘break’câu lệnh và tên nhãn của nó. Ngoài ra, không nên có bất kỳ câu lệnh nào khác giữa tên nhãn và một vòng lặp liên quan.
Ví dụ: Nhãn có ngắt
void main() {
outerloop: // This is the label name
for (var i = 0; i < 5; i++) {
print("Innerloop: ${i}"); innerloop: for (var j = 0; j < 5; j++) { if (j > 3 ) break ; // Quit the innermost loop if (i == 2) break innerloop; // Do the same thing if (i == 4) break outerloop; // Quit the outer loop print("Innerloop: ${j}");
}
}
}
Sau output được hiển thị khi thực hiện thành công đoạn mã trên.
Innerloop: 0
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 1
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 2
Innerloop: 3
Innerloop: 0
Innerloop: 1
Innerloop: 2
Innerloop: 3
Innerloop: 4
Ví dụ: Gắn nhãn với tiếp tục
void main() {
outerloop: // This is the label name
for (var i = 0; i < 3; i++) {
print("Outerloop:${i}"); for (var j = 0; j < 5; j++) { if (j == 3){ continue outerloop; } print("Innerloop:${j}");
}
}
}
Kết quả sau được hiển thị khi thực hiện thành công đoạn mã trên.
Outerloop: 0
Innerloop: 0
Innerloop: 1
Innerloop: 2
Outerloop: 1
Innerloop: 0
Innerloop: 1
Innerloop: 2
Outerloop: 2
Innerloop: 0
Innerloop: 1
Innerloop: 2
Một cấu trúc ra quyết định / có điều kiện đánh giá một điều kiện trước khi các lệnh được thực thi.
Các cấu trúc có điều kiện trong Dart được phân loại trong bảng sau.
Sr.No | Tuyên bố & Mô tả |
---|---|
1 | if tuyên bố An if câu lệnh bao gồm một biểu thức Boolean theo sau là một hoặc nhiều câu lệnh. |
2 | Nếu ... Tuyên bố khác An if có thể được theo sau bởi một tùy chọn elsekhối. Cácelse khối sẽ thực thi nếu biểu thức Boolean được kiểm tra bởi if khối đánh giá thành false. |
3 | khác… nếu Thang Các else…if ladderrất hữu ích để kiểm tra nhiều điều kiện. Sau đây là cú pháp tương tự. |
4 | switch… case Tuyên bố Câu lệnh switch đánh giá một biểu thức, so khớp giá trị của biểu thức với một mệnh đề trường hợp và thực hiện các câu lệnh liên quan đến trường hợp đó. |
Số phi tiêu có thể được phân loại là -
int- Số nguyên có kích thước tùy ý. Cácint kiểu dữ liệu được sử dụng để biểu diễn số nguyên.
double- Số dấu phẩy động 64 bit (độ chính xác kép), như được chỉ định bởi tiêu chuẩn IEEE 754. Cácdouble kiểu dữ liệu được sử dụng để biểu thị số phân số
Các num loại được kế thừa bởi int và doublecác loại. Cácdart core library cho phép nhiều phép toán trên các giá trị số.
Cú pháp khai báo một số như dưới đây:
int var_name; // declares an integer variable
double var_name; // declares a double variable
Thí dụ
void main() {
// declare an integer
int num1 = 10;
// declare a double value
double num2 = 10.50;
// print the values
print(num1);
print(num2);
}
Nó sẽ tạo ra kết quả sau:
10
10.5
Note - Sự Dart VM sẽ ném ra một ngoại lệ nếu các giá trị phân số được gán cho các biến số nguyên.
Phân tích cú pháp
Các parse()Hàm static cho phép phân tích cú pháp một chuỗi chứa ký tự số thành một số. Hình minh họa sau đây cho thấy điều tương tự -
void main() {
print(num.parse('12'));
print(num.parse('10.91'));
}
Đoạn mã trên sẽ dẫn đến kết quả sau:
12
10.91
Hàm phân tích cú pháp ném một FormatExceptionnếu nó được chuyển vào bất kỳ giá trị nào khác ngoài chữ số. Đoạn mã sau đây cho biết cách chuyển một giá trị chữ-số choparse() chức năng.
Thí dụ
void main() {
print(num.parse('12A'));
print(num.parse('AAAA'));
}
Đoạn mã trên sẽ dẫn đến kết quả sau:
Unhandled exception:
FormatException: 12A
#0 num.parse (dart:core/num.dart:446)
#1 main (file:///D:/Demos/numbers.dart:4:13)
#2 _startIsolate.<anonymous closure> (dart:isolatepatch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolatepatch/isolate_patch.dart:148)
Thuộc tính số
Bảng sau liệt kê các thuộc tính được hỗ trợ bởi số Dart.
Sr.No | Kê khai tài sản |
---|---|
1 | Mã Băm Trả về mã băm cho một giá trị số. |
2 | isFinite Đúng nếu số là hữu hạn; ngược lại, sai. |
3 | là vô hạn Đúng nếu số là dương vô cùng hoặc âm vô cùng; ngược lại, sai. |
4 | isNan Đúng nếu số là giá trị Không phải số kép; ngược lại, sai. |
5 | isNegative Đúng nếu số âm; ngược lại, sai. |
6 | ký tên Trả về trừ một, không hoặc cộng một tùy thuộc vào dấu và giá trị số của số. |
7 | isEven Trả về true nếu số là số chẵn. |
số 8 | là số lẻ Trả về true nếu số là số lẻ. |
Phương pháp số
Dưới đây là danh sách các phương pháp thường được sử dụng được hỗ trợ bởi các số:
Sr.No | Phương pháp & Mô tả |
---|---|
1 | cơ bụng Trả về giá trị tuyệt đối của một số. |
2 | ceil Trả về số nguyên nhỏ nhất không nhỏ hơn số. |
3 | so với So sánh số này với số khác. |
4 | Sàn nhà Trả về số nguyên lớn nhất không lớn hơn số hiện tại. |
5 | phần còn lại Trả về phần còn lại bị cắt ngắn sau khi chia hai số. |
6 | Tròn Trả về số nguyên gần nhất với các số hiện tại. |
7 | toDouble Trả về số tương đương gấp đôi. |
số 8 | toInt Trả về số tương đương số nguyên. |
9 | Trả về biểu diễn tương đương chuỗi của số. |
10 | cắt bớt Trả về một số nguyên sau khi loại bỏ bất kỳ chữ số phân số nào. |
Kiểu dữ liệu Chuỗi đại diện cho một chuỗi ký tự. Chuỗi Dart là một chuỗi gồm 16 đơn vị mã UTF.
Giá trị chuỗi trong Dart có thể được biểu diễn bằng cách sử dụng dấu nháy đơn hoặc dấu ngoặc kép hoặc dấu ngoặc kép. Các chuỗi dòng đơn được biểu diễn bằng cách sử dụng dấu ngoặc kép hoặc đơn. Dấu ngoặc kép được sử dụng để đại diện cho các chuỗi nhiều dòng.
Cú pháp đại diện cho các giá trị chuỗi trong Dart như sau:
Cú pháp
String variable_name = 'value'
OR
String variable_name = ''value''
OR
String variable_name = '''line1
line2'''
OR
String variable_name= ''''''line1
line2''''''
Ví dụ sau minh họa việc sử dụng kiểu dữ liệu Chuỗi trong Dart.
void main() {
String str1 = 'this is a single line string';
String str2 = "this is a single line string";
String str3 = '''this is a multiline line string''';
String str4 = """this is a multiline line string""";
print(str1);
print(str2);
print(str3);
print(str4);
}
Nó sẽ tạo ra những thứ sau Output -
this is a single line string
this is a single line string
this is a multiline line string
this is a multiline line string
Chuỗi là bất biến. Tuy nhiên, các chuỗi có thể phải chịu nhiều hoạt động khác nhau và chuỗi kết quả có thể được lưu trữ dưới dạng giá trị mới.
Nội suy chuỗi
Quá trình tạo một chuỗi mới bằng cách thêm một giá trị vào một chuỗi tĩnh được gọi là concatenation hoặc là interpolation. Nói cách khác, nó là quá trình thêm một chuỗi vào một chuỗi khác.
Toán tử cộng (+) là một cơ chế thường được sử dụng để nối / nội suy các chuỗi.
ví dụ 1
void main() {
String str1 = "hello";
String str2 = "world";
String res = str1+str2;
print("The concatenated string : ${res}");
}
Nó sẽ tạo ra những thứ sau output -
The concatenated string : Helloworld
Ví dụ 2
Bạn có thể sử dụng "$ {}" có thể được sử dụng để nội suy giá trị của một biểu thức Dart trong chuỗi. Ví dụ sau đây minh họa tương tự.
void main() {
int n=1+1;
String str1 = "The sum of 1 and 1 is ${n}"; print(str1); String str2 = "The sum of 2 and 2 is ${2+2}";
print(str2);
}
Nó sẽ tạo ra những thứ sau output -
The sum of 1 and 1 is 2
The sum of 2 and 2 is 4
Thuộc tính chuỗi
Các thuộc tính được liệt kê trong bảng sau đây đều ở chế độ chỉ đọc.
Sr.No | Kê khai tài sản |
---|---|
1 | codeUnits Trả về danh sách không thể sửa đổi của các đơn vị mã UTF-16 của chuỗi này. |
2 | isEmpty Trả về true nếu chuỗi này trống. |
3 | Chiều dài Trả về độ dài của chuỗi bao gồm các ký tự khoảng trắng, tab và dòng mới. |
Phương pháp thao tác chuỗi
Lớp Chuỗi trong dart: core librarycũng cung cấp các phương thức để thao tác với chuỗi. Một số phương pháp này được đưa ra dưới đây:
Sr.No | Phương pháp & Mô tả |
---|---|
1 | toLowerCase () Chuyển đổi tất cả các ký tự trong chuỗi này thành chữ thường. |
2 | Đến trường hợp trên() Chuyển đổi tất cả các ký tự trong chuỗi này thành chữ hoa. |
3 | trim () Trả về chuỗi không có bất kỳ khoảng trắng đầu và cuối. |
4 | so với() So sánh đối tượng này với đối tượng khác. |
5 | thay thế tất cả() Thay thế tất cả các chuỗi con phù hợp với mẫu được chỉ định bằng một giá trị nhất định. |
6 | tách () Tách chuỗi tại các trận đấu của dấu phân cách được chỉ định và trả về danh sách các chuỗi con. |
7 | chuỗi con () Trả về chuỗi con của chuỗi này kéo dài từ startIndex, inclusive, đến endIndex, unique. |
số 8 | toString () Trả về biểu diễn chuỗi của đối tượng này. |
9 | codeUnitAt () Trả về đơn vị mã UTF-16 16 bit tại chỉ mục đã cho. |
Dart cung cấp hỗ trợ sẵn có cho kiểu dữ liệu Boolean. Kiểu dữ liệu Boolean trong DART chỉ hỗ trợ hai giá trị - đúng và sai. Từ khóa bool được sử dụng để biểu thị một ký tự Boolean trong DART.
Cú pháp để khai báo biến Boolean trong DART như sau:
bool var_name = true;
OR
bool var_name = false
Thí dụ
void main() {
bool test;
test = 12 > 5;
print(test);
}
Nó sẽ tạo ra những thứ sau output -
true
Thí dụ
Không giống như JavaScript, kiểu dữ liệu Boolean chỉ nhận ra nghĩa đen là true. Bất kỳ giá trị nào khác được coi là sai. Hãy xem xét ví dụ sau:
var str = 'abc';
if(str) {
print('String is not empty');
} else {
print('Empty String');
}
Đoạn mã trên, nếu chạy bằng JavaScript, sẽ in ra thông báo 'Chuỗi không trống' vì cấu trúc if sẽ trả về true nếu chuỗi không trống.
Tuy nhiên, trong Dart, strđược chuyển đổi thành false dưới dạng str! = true . Do đó, đoạn mã sẽ in ra thông báo 'Chuỗi trống' (khi chạy ở chế độ không được chọn).
Thí dụ
Đoạn mã trên nếu chạy trong checkedchế độ sẽ ném một ngoại lệ. Tương tự được minh họa bên dưới -
void main() {
var str = 'abc';
if(str) {
print('String is not empty');
} else {
print('Empty String');
}
}
Nó sẽ tạo ra những thứ sau output, trong Checked Mode -
Unhandled exception:
type 'String' is not a subtype of type 'bool' of 'boolean expression' where
String is from dart:core
bool is from dart:core
#0 main (file:///D:/Demos/Boolean.dart:5:6)
#1 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Nó sẽ tạo ra những thứ sau output, trong Unchecked Mode -
Empty String
Note - Sự WebStorm IDE chạy ở chế độ đã chọn, theo mặc định.
Một tập hợp rất thường được sử dụng trong lập trình là array. Dart đại diện cho các mảng ở dạngListcác đối tượng. AListchỉ đơn giản là một nhóm đối tượng có thứ tự. Cácdart:core thư viện cung cấp lớp Danh sách cho phép tạo và thao tác với danh sách.
Biểu diễn logic của một danh sách trong Dart được đưa ra dưới đây:
test_list - là định danh tham chiếu đến bộ sưu tập.
Danh sách chứa các giá trị 12, 13 và 14. Các khối bộ nhớ chứa các giá trị này được gọi là elements.
Mỗi phần tử trong Danh sách được xác định bằng một số duy nhất được gọi là index. Chỉ mục bắt đầu từzero và mở rộng lên đến n-1 Ở đâu nlà tổng số phần tử trong Danh sách. Chỉ số này cũng được gọi làsubscript.
Danh sách có thể được phân loại là -
- Danh sách độ dài cố định
- Danh sách có thể phát triển
Bây giờ chúng ta hãy thảo luận về hai loại lists chi tiết.
Danh sách độ dài cố định
Độ dài của danh sách độ dài cố định không thể thay đổi trong thời gian chạy. Cú pháp để tạo danh sách có độ dài cố định như dưới đây:
Step 1 − Declaring a list
Cú pháp khai báo danh sách có độ dài cố định được đưa ra dưới đây:
var list_name = new List(initial_size)
Cú pháp trên tạo một danh sách có kích thước được chỉ định. Danh sách không thể phát triển hoặc thu nhỏ trong thời gian chạy. Mọi nỗ lực thay đổi kích thước danh sách sẽ dẫn đến một ngoại lệ.
Step 2 − Initializing a list
Cú pháp để khởi tạo một danh sách như dưới đây:
lst_name[index] = value;
Thí dụ
void main() {
var lst = new List(3);
lst[0] = 12;
lst[1] = 13;
lst[2] = 11;
print(lst);
}
Nó sẽ tạo ra những thứ sau output -
[12, 13, 11]
Danh sách có thể phát triển
Độ dài của danh sách có thể phát triển có thể thay đổi tại thời điểm chạy. Cú pháp để khai báo và khởi tạo một danh sách có thể phát triển như dưới đây:
Step 1 − Declaring a List
var list_name = [val1,val2,val3]
--- creates a list containing the specified values
OR
var list_name = new List()
--- creates a list of size zero
Step 2 − Initializing a List
Chỉ mục / chỉ số con được sử dụng để tham chiếu phần tử sẽ được điền một giá trị. Cú pháp để khởi tạo một danh sách như dưới đây:
list_name[index] = value;
Thí dụ
Ví dụ sau đây cho thấy cách tạo một danh sách gồm 3 phần tử.
void main() {
var num_list = [1,2,3];
print(num_list);
}
Nó sẽ tạo ra những thứ sau output -
[1, 2, 3]
Thí dụ
Ví dụ sau tạo danh sách có độ dài bằng 0 bằng cách sử dụng empty List() constructor. Cácadd() chức năng trong List lớp được sử dụng để thêm động các phần tử vào danh sách.
void main() {
var lst = new List();
lst.add(12);
lst.add(13);
print(lst);
}
Nó sẽ tạo ra những thứ sau output -
[12, 13]
Liệt kê Thuộc tính
Bảng sau liệt kê một số thuộc tính thường được sử dụng của List lớp học trong dart:core library.
Sr.No | Phương pháp & Mô tả |
---|---|
1 | Đầu tiên Trả về trường hợp phần tử đầu tiên. |
2 | isEmpty Trả về true nếu tập hợp không có phần tử nào. |
3 | không có sản phẩm nào Trả về true nếu tập hợp có ít nhất một phần tử. |
4 | chiều dài Trả về kích thước của danh sách. |
5 | Cuối cùng Trả về phần tử cuối cùng trong danh sách. |
6 | đảo ngược Trả về một đối tượng có thể lặp lại chứa các giá trị trong danh sách theo thứ tự ngược lại. |
7 | Độc thân Kiểm tra nếu danh sách chỉ có một phần tử và trả về nó. |
Trong chương này, chúng ta sẽ thảo luận về cách thực hiện một số thao tác cơ bản trên Danh sách, chẳng hạn như:
Sr.No | Hoạt động cơ bản & Mô tả |
---|---|
1 | Chèn các phần tử vào một danh sách Danh sách có thể thay đổi có thể phát triển linh hoạt trong thời gian chạy. CácList.add() function appends the specified value to the end of the List and returns a modified List object. |
2 | Updating a list Lists in Dart can be updated by −
|
3 | Removing List items The following functions supported by the List class in the dart:core library can be used to remove the item(s) in a List. |
The Map object is a simple key/value pair. Keys and values in a map may be of any type. A Map is a dynamic collection. In other words, Maps can grow and shrink at runtime.
Maps can be declared in two ways −
- Using Map Literals
- Using a Map constructor
Declaring a Map using Map Literals
To declare a map using map literals, you need to enclose the key-value pairs within a pair of curly brackets "{ }".
Here is its syntax −
var identifier = { key1:value1, key2:value2 [,…..,key_n:value_n] }
Khai báo bản đồ bằng cách sử dụng hàm tạo bản đồ
Để khai báo một Bản đồ bằng cách sử dụng hàm tạo Bản đồ, chúng ta có hai bước. Đầu tiên, khai báo bản đồ và thứ hai, khởi tạo bản đồ.
Các syntax đến declare a map như sau -
var identifier = new Map()
Bây giờ, hãy sử dụng cú pháp sau để initialize the map -
map_name[key] = value
Ví dụ: Map Literal
void main() {
var details = {'Usrname':'tom','Password':'pass@123'};
print(details);
}
Nó sẽ tạo ra những thứ sau output -
{Usrname: tom, Password: pass@123}
Ví dụ: Thêm giá trị vào bản đồ chữ trong thời gian chạy
void main() {
var details = {'Usrname':'tom','Password':'pass@123'};
details['Uid'] = 'U1oo1';
print(details);
}
Nó sẽ tạo ra những thứ sau output -
{Usrname: tom, Password: pass@123, Uid: U1oo1}
Ví dụ: Trình tạo bản đồ
void main() {
var details = new Map();
details['Usrname'] = 'admin';
details['Password'] = 'admin@123';
print(details);
}
Nó sẽ tạo ra những thứ sau output -
{Usrname: admin, Password: admin@123}
Note - Một giá trị bản đồ có thể là bất kỳ đối tượng nào kể cả NULL.
Bản đồ - Thuộc tính
Các Map lớp trong gói dart: core xác định các thuộc tính sau:
Sr.No | Kê khai tài sản |
---|---|
1 | Chìa khóa Trả về một đối tượng có thể lặp lại đại diện cho các khóa |
2 | Giá trị Trả về một đối tượng có thể lặp lại đại diện cho các giá trị |
3 | Chiều dài Trả về kích thước của Bản đồ |
4 | isEmpty Trả về true nếu Bản đồ là Bản đồ trống |
5 | không có sản phẩm nào Trả về true nếu Bản đồ là Bản đồ trống |
Bản đồ - Chức năng
Sau đây là các chức năng thường được sử dụng để thao tác với Maps trong Dart.
Sr.No | Tên & Mô tả chức năng |
---|---|
1 | addAll () Thêm tất cả các cặp khóa-giá trị khác vào bản đồ này. |
2 | thông thoáng() Xóa tất cả các cặp khỏi bản đồ. |
3 | tẩy() Xóa khóa và giá trị liên quan của nó, nếu có, khỏi bản đồ. |
4 | cho mỗi() Áp dụng cho từng cặp khóa-giá trị của bản đồ. |
Các ký hiệu trong Dart là tên chuỗi động, không rõ ràng được sử dụng để phản ánh siêu dữ liệu từ thư viện. Nói một cách đơn giản, các ký hiệu là một cách để lưu trữ mối quan hệ giữa một chuỗi mà con người có thể đọc được và một chuỗi được tối ưu hóa để sử dụng bởi máy tính.
Reflection là một cơ chế để lấy siêu dữ liệu của một loại trong thời gian chạy như số phương thức trong một lớp, số lượng hàm tạo nó có hoặc số lượng tham số trong một hàm. Bạn thậm chí có thể gọi một phương thức của kiểu được tải trong thời gian chạy.
Các lớp cụ thể về phản xạ In Dart có sẵn trong dart:mirrorsgói hàng. Thư viện này hoạt động trong cả ứng dụng web và ứng dụng dòng lệnh.
Cú pháp
Symbol obj = new Symbol('name');
// expects a name of class or function or library to reflect
Các name phải là tên thành viên Dart công cộng hợp lệ, tên phương thức khởi tạo công cộng hoặc tên thư viện.
Thí dụ
Hãy xem xét ví dụ sau. Mã khai báo một lớpFoo ở trong thư viện foo_lib. Lớp định nghĩa các phương thứcm1, m2, và m3.
Nghệ thuật ẩm thực
library foo_lib;
// libarary name can be a symbol
class Foo {
// class name can be a symbol
m1() {
// method name can be a symbol
print("Inside m1");
}
m2() {
print("Inside m2");
}
m3() {
print("Inside m3");
}
}
Mã sau tải Foo.dartthư viện và tìm kiếm lớp Foo, với sự trợ giúp của loại Biểu tượng. Vì chúng tôi đang phản ánh siêu dữ liệu từ thư viện trên nên mã sẽ nhậpdart:mirrors thư viện.
FooSymbol.dart
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
//library name stored as Symbol
Symbol clsToSearch = new Symbol("Foo");
// class name stored as Symbol
if(checkIf_classAvailableInlibrary(lib, clsToSearch))
// searches Foo class in foo_lib library
print("class found..");
}
bool checkIf_classAvailableInlibrary(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) return true;
return false;
}
}
Lưu ý rằng dòng libMirror.decl Tuyên bố.forEach ((s, d) => print (s)); sẽ lặp lại mọi khai báo trong thư viện trong thời gian chạy và in các khai báo dưới dạngSymbol.
Mã này sẽ tạo ra những điều sau output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo") // class name displayed as symbol
class found.
Ví dụ: Hiển thị số lượng các phương thức thể hiện của một lớp
Bây giờ chúng ta hãy xem xét việc hiển thị số lượng các phương thức thể hiện trong một lớp. Lớp được xác định trướcClassMirror giúp chúng tôi đạt được điều tương tự.
import 'dart:core';
import 'dart:mirrors';
import 'Foo.dart';
main() {
Symbol lib = new Symbol("foo_lib");
Symbol clsToSearch = new Symbol("Foo");
reflect_InstanceMethods(lib, clsToSearch);
}
void reflect_InstanceMethods(Symbol libraryName, Symbol className) {
MirrorSystem mirrorSystem = currentMirrorSystem();
LibraryMirror libMirror = mirrorSystem.findLibrary(libraryName);
if (libMirror != null) {
print("Found Library");
print("checkng...class details..");
print("No of classes found is : ${libMirror.declarations.length}");
libMirror.declarations.forEach((s, d) => print(s));
if (libMirror.declarations.containsKey(className)) print("found class");
ClassMirror classMirror = libMirror.declarations[className];
print("No of instance methods found is ${classMirror.instanceMembers.length}");
classMirror.instanceMembers.forEach((s, v) => print(s));
}
}
Mã này sẽ tạo ra những điều sau output -
Found Library
checkng...class details..
No of classes found is : 1
Symbol("Foo")
found class
No of instance methods found is 8
Symbol("==")
Symbol("hashCode")
Symbol("toString")
Symbol("noSuchMethod")
Symbol("runtimeType")
Symbol("m1")
Symbol("m2")
Symbol("m3")
Chuyển đổi biểu tượng thành chuỗi
Bạn có thể chuyển đổi tên của một loại như lớp hoặc thư viện được lưu trữ trong một biểu tượng trở lại chuỗi bằng cách sử dụng MirrorSystemlớp học. Đoạn mã sau đây cho thấy cách bạn có thể chuyển đổi một biểu tượng thành một chuỗi.
import 'dart:mirrors';
void main(){
Symbol lib = new Symbol("foo_lib");
String name_of_lib = MirrorSystem.getName(lib);
print(lib);
print(name_of_lib);
}
Nó sẽ tạo ra những thứ sau output -
Symbol("foo_lib")
foo_lib
Chuỗi là một chuỗi các ký tự. Dart đại diện cho các chuỗi dưới dạng một chuỗi các đơn vị mã Unicode UTF-16. Unicode là một định dạng xác định một giá trị số duy nhất cho mỗi chữ cái, chữ số và ký hiệu.
Vì chuỗi Dart là một chuỗi các đơn vị mã UTF-16, các giá trị Unicode 32-bit trong một chuỗi được biểu diễn bằng cú pháp đặc biệt. Arune là một số nguyên đại diện cho một điểm mã Unicode.
Lớp Chuỗi trong dart:core thư viện cung cấp các cơ chế để truy cập runes. Các đơn vị / rune mã chuỗi có thể được truy cập theo ba cách:
- Sử dụng hàm String.codeUnitAt ()
- Sử dụng thuộc tính String.codeUnits
- Sử dụng thuộc tính String.runes
Hàm String.codeUnitAt ()
Các đơn vị mã trong một chuỗi có thể được truy cập thông qua các chỉ mục của chúng. Trả về đơn vị mã UTF-16 16 bit tại chỉ mục đã cho.
Cú pháp
String.codeUnitAt(int index);
Thí dụ
import 'dart:core';
void main(){
f1();
}
f1() {
String x = 'Runes';
print(x.codeUnitAt(0));
}
Nó sẽ tạo ra những thứ sau output -
82
Thuộc tính String.codeUnits
Thuộc tính này trả về một danh sách không thể thay đổi của các đơn vị mã UTF-16 của chuỗi được chỉ định.
Cú pháp
String. codeUnits;
Thí dụ
import 'dart:core';
void main(){
f1();
}
f1() {
String x = 'Runes';
print(x.codeUnits);
}
Nó sẽ tạo ra những thứ sau output -
[82, 117, 110, 101, 115]
Thuộc tính String.runes
Thuộc tính này trả về một điểm mã Unicode có thể lặp lại của nó string.Runes mở rộng có thể lặp lại.
Cú pháp
String.runes
Thí dụ
void main(){
"A string".runes.forEach((int rune) {
var character=new String.fromCharCode(rune);
print(character);
});
}
Nó sẽ tạo ra những thứ sau output -
A
s
t
r
i
n
g
Các điểm mã Unicode thường được biểu thị bằng \uXXXX, trong đó XXXX là giá trị thập lục phân gồm 4 chữ số. Để chỉ định nhiều hơn hoặc ít hơn 4 chữ số hex, hãy đặt giá trị trong dấu ngoặc nhọn. Người ta có thể sử dụng hàm tạo của lớp Runes trong thư viện dart: core cho tương tự.
Thí dụ
main() {
Runes input = new Runes(' \u{1f605} ');
print(new String.fromCharCodes(input));
}
Nó sẽ tạo ra những thứ sau output -
Một kiểu liệt kê được sử dụng để xác định các giá trị hằng số được đặt tên. Một kiểu liệt kê được khai báo bằng cách sử dụngenum từ khóa.
Cú pháp
enum enum_name {
enumeration list
}
Ở đâu,
- Các enum_name chỉ định tên kiểu enumeration
- Các danh sách liệt kê một danh sách bằng dấu phẩy của định danh
Mỗi ký hiệu trong danh sách liệt kê là viết tắt của một giá trị số nguyên, một giá trị lớn hơn ký hiệu đứng trước nó. Theo mặc định, giá trị của ký hiệu liệt kê đầu tiên là 0.
Ví dụ
enum Status {
none,
running,
stopped,
paused
}
Thí dụ
enum Status {
none,
running,
stopped,
paused
}
void main() {
print(Status.values);
Status.values.forEach((v) => print('value: $v, index: ${v.index}')); print('running: ${Status.running}, ${Status.running.index}'); print('running index: ${Status.values[1]}');
}
Nó sẽ tạo ra những thứ sau output -
[Status.none, Status.running, Status.stopped, Status.paused]
value: Status.none, index: 0
value: Status.running, index: 1
value: Status.stopped, index: 2
value: Status.paused, index: 3
running: Status.running, 1
running index: Status.running
Các hàm là các khối xây dựng của mã có thể đọc được, có thể bảo trì và có thể tái sử dụng. Hàm là một tập hợp các câu lệnh để thực hiện một nhiệm vụ cụ thể. Các hàm tổ chức chương trình thành các khối mã logic. Sau khi được xác định, các hàm có thể được gọi để truy cập mã. Điều này làm cho mã có thể được sử dụng lại. Hơn nữa, các hàm giúp bạn dễ dàng đọc và duy trì mã của chương trình.
Một khai báo hàm cho trình biên dịch biết về tên, kiểu trả về và các tham số của hàm. Một định nghĩa hàm cung cấp nội dung thực tế của hàm.
Sr.No | Chức năng & Mô tả |
---|---|
1 | Xác định một chức năng Một định nghĩa hàm xác định những gì và cách thức một nhiệm vụ cụ thể sẽ được thực hiện. |
2 | Gọi một hàm Một hàm phải được gọi để thực thi nó. |
3 | Trả lại các chức năng Các hàm cũng có thể trả về giá trị cùng với điều khiển, quay lại người gọi. |
4 | Chức năng được tham số hóa Tham số là một cơ chế để truyền giá trị cho các hàm. |
Các thông số tùy chọn
Các tham số tùy chọn có thể được sử dụng khi các đối số không cần được truyền bắt buộc để thực thi một hàm. Một tham số có thể được đánh dấu tùy chọn bằng cách thêm dấu chấm hỏi vào tên của nó. Tham số tùy chọn phải được đặt làm đối số cuối cùng trong một hàm.
Chúng tôi có ba loại tham số tùy chọn trong Dart -
Sr.No | Mô tả về Thông Số |
---|---|
1 | Tham số vị trí tùy chọn Để chỉ định các tham số vị trí tùy chọn, hãy sử dụng dấu ngoặc vuông []. |
2 | Tham số có tên tùy chọn Không giống như các tham số vị trí, tên của tham số phải được chỉ định trong khi giá trị đang được truyền. Dấu ngoặc nhọn {} có thể được sử dụng để chỉ định các tham số có tên tùy chọn. |
3 | Tham số tùy chọn với giá trị mặc định Các tham số hàm cũng có thể được gán giá trị theo mặc định. Tuy nhiên, các tham số như vậy cũng có thể là các giá trị được truyền rõ ràng. |
Các hàm phi tiêu đệ quy
Đệ quy là một kỹ thuật để lặp lại một hoạt động bằng cách gọi một hàm đến chính nó lặp đi lặp lại cho đến khi nó đi đến kết quả. Đệ quy được áp dụng tốt nhất khi bạn cần gọi nhiều lần cùng một hàm với các tham số khác nhau từ trong một vòng lặp.
Thí dụ
void main() {
print(factorial(6));
}
factorial(number) {
if (number <= 0) {
// termination case
return 1;
} else {
return (number * factorial(number - 1));
// function invokes itself
}
}
Nó sẽ tạo ra những thứ sau output -
720
Các hàm Lambda
Các hàm Lambda là một cơ chế ngắn gọn để biểu diễn các hàm. Các hàm này còn được gọi là hàm Mũi tên.
Cú pháp
[return_type]function_name(parameters)=>expression;
Thí dụ
void main() {
printMsg();
print(test());
}
printMsg()=>
print("hello");
int test()=>123;
// returning function
Nó sẽ tạo ra những thứ sau output -
hello 123
An interfacexác định cú pháp mà bất kỳ thực thể nào phải tuân theo. Giao diện xác định một tập hợp các phương thức có sẵn trên một đối tượng. Dart không có cú pháp để khai báo giao diện. Các khai báo lớp chính là giao diện trong Dart.
Classesnên sử dụng từ khóa triển khai để có thể sử dụng một giao diện. Lớp thực thi bắt buộc phải cung cấp một bản triển khai cụ thể của tất cả các chức năng của giao diện được triển khai. Nói cách khác, một lớp phải xác định lại mọi chức năng trong giao diện mà nó muốn thực hiện.
Cú pháp: Triển khai một giao diện
class identifier implements interface_name
Thí dụ
Trong chương trình sau, chúng tôi đang khai báo một lớp Printer. CácConsolePrinter lớp triển khai khai báo giao diện ngầm định cho Printerlớp học. Cácmain hàm tạo ra một đối tượng của ConsolePrinter lớp học sử dụng newtừ khóa. Đối tượng này được sử dụng để gọi hàmprint_data được định nghĩa trong ConsolePrinter lớp học.
void main() {
ConsolePrinter cp= new ConsolePrinter();
cp.print_data();
}
class Printer {
void print_data() {
print("__________Printing Data__________");
}
}
class ConsolePrinter implements Printer {
void print_data() {
print("__________Printing to Console__________");
}
}
Nó sẽ tạo ra những thứ sau output -
__________Printing to Console__________
Triển khai nhiều giao diện
Một lớp có thể triển khai nhiều giao diện. Các giao diện được phân tách bằng dấu phẩy. Cácsyntax cho tương tự được đưa ra bên dưới -
class identifier implements interface-1,interface_2,interface_4…….
Sau example cho thấy cách bạn có thể triển khai nhiều giao diện trong Dart -
void main() {
Calculator c = new Calculator();
print("The gross total : ${c.ret_tot()}"); print("Discount :${c.ret_dis()}");
}
class Calculate_Total {
int ret_tot() {}
}
class Calculate_Discount {
int ret_dis() {}
}
class Calculator implements Calculate_Total,Calculate_Discount {
int ret_tot() {
return 1000;
}
int ret_dis() {
return 50;
}
}
Nó sẽ tạo ra những thứ sau output -
The gross total: 1000
Discount:50
Dart là một ngôn ngữ hướng đối tượng. Nó hỗ trợ các tính năng lập trình hướng đối tượng như lớp, giao diện, v.v. Aclassvề mặt OOP là một bản thiết kế để tạo ra các đối tượng. Aclassđóng gói dữ liệu cho đối tượng. Dart cung cấp hỗ trợ tích hợp cho khái niệm này được gọi làclass.
Khai báo một lớp
Sử dụng class từ khóa để khai báo một classtrong Dart. Định nghĩa lớp bắt đầu bằng lớp từ khóa, theo sau làclass name; và phần thân của lớp được bao bởi một cặp dấu ngoặc nhọn. Cú pháp tương tự được đưa ra dưới đây:
Cú pháp
class class_name {
<fields>
<getters/setters>
<constructors>
<functions>
}
Các classtheo sau từ khóa là tên lớp. Các quy tắc cho định danh phải được xem xét trong khi đặt tên một lớp.
Một định nghĩa lớp có thể bao gồm những điều sau:
Fields- Trường là bất kỳ biến nào được khai báo trong một lớp. Các trường đại diện cho dữ liệu liên quan đến các đối tượng.
Setters and Getters- Cho phép chương trình khởi tạo và lấy giá trị của các trường của một lớp. Một getter / setter mặc định được liên kết với mọi lớp. Tuy nhiên, những cái mặc định có thể bị ghi đè bằng cách xác định rõ ràng một setter / getter.
Constructors - chịu trách nhiệm cấp phát bộ nhớ cho các đối tượng của lớp.
Functions- Các hàm thể hiện các hành động mà một đối tượng có thể thực hiện. Đôi khi chúng cũng được gọi là phương pháp.
Các thành phần này kết hợp với nhau được gọi là data members của lớp.
Ví dụ: Khai báo một lớp
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
Ví dụ khai báo một lớp Car. Lớp có một trường có tênengine. Cácdisp() là một hàm đơn giản in ra giá trị của trường engine.
Tạo phiên bản của lớp
Để tạo một phiên bản của lớp, hãy sử dụng newtừ khóa theo sau là tên lớp. Cú pháp tương tự được đưa ra dưới đây:
Cú pháp
var object_name = new class_name([ arguments ])
Các new từ khóa chịu trách nhiệm cho việc khởi tạo.
Phía bên phải của biểu thức gọi hàm tạo. Hàm tạo phải được truyền các giá trị nếu nó được tham số hóa.
Ví dụ: Khởi tạo một lớp
var obj = new Car("Engine 1")
Truy cập thuộc tính và chức năng
Các thuộc tính và chức năng của một lớp có thể được truy cập thông qua đối tượng. Sử dụng '.' ký hiệu dấu chấm (được gọi làperiod) để truy cập các thành viên dữ liệu của một lớp.
//accessing an attribute
obj.field_name
//accessing a function
obj.function_name()
Thí dụ
Hãy xem ví dụ sau để hiểu cách truy cập các thuộc tính và chức năng trong Dart -
void main() {
Car c= new Car();
c.disp();
}
class Car {
// field
String engine = "E1001";
// function
void disp() {
print(engine);
}
}
Các output của đoạn mã trên như sau:
E1001
Máy tạo phi tiêu
Hàm tạo là một hàm đặc biệt của lớp có nhiệm vụ khởi tạo các biến của lớp. Dart định nghĩa một phương thức khởi tạo có cùng tên với tên của lớp. Hàm tạo là một hàm và do đó có thể được tham số hóa. Tuy nhiên, không giống như một hàm, các hàm tạo không thể có kiểu trả về. Nếu bạn không khai báo hàm tạo, mặc địnhno-argument constructor được cung cấp cho bạn.
Cú pháp
Class_name(parameter_list) {
//constructor body
}
Thí dụ
Ví dụ sau đây cho thấy cách sử dụng các hàm tạo trong Dart:
void main() {
Car c = new Car('E1001');
}
class Car {
Car(String engine) {
print(engine);
}
}
Nó sẽ tạo ra những thứ sau output -
E1001
Trình tạo được đặt tên
Dart cung cấp named constructors để kích hoạt một lớp xác định multiple constructors. Cú pháp của các hàm tạo được đặt tên như dưới đây:
Cú pháp: Định nghĩa hàm tạo
Class_name.constructor_name(param_list)
Thí dụ
Ví dụ sau đây cho thấy cách bạn có thể sử dụng các hàm tạo được đặt tên trong Dart:
void main() {
Car c1 = new Car.namedConst('E1001');
Car c2 = new Car();
}
class Car {
Car() {
print("Non-parameterized constructor invoked");
}
Car.namedConst(String engine) {
print("The engine is : ${engine}");
}
}
Nó sẽ tạo ra những thứ sau output -
The engine is : E1001
Non-parameterized constructor invoked
Từ khóa này
Các thistừ khóa đề cập đến phiên bản hiện tại của lớp. Ở đây, tên tham số và tên trường của lớp giống nhau. Do đó, để tránh sự mơ hồ, trường của lớp được bắt đầu bằngthistừ khóa. Ví dụ sau giải thích tương tự -
Thí dụ
Ví dụ sau giải thích cách sử dụng this từ khóa trong Dart -
void main() {
Car c1 = new Car('E1001');
}
class Car {
String engine;
Car(String engine) {
this.engine = engine;
print("The engine is : ${engine}");
}
}
Nó sẽ tạo ra những thứ sau output -
The engine is : E1001
Dart Class ─ Getters and Setters
Getters và Setters, còn được gọi là accessors và mutators, cho phép chương trình khởi tạo và lấy giá trị của các trường lớp tương ứng. Người nhận hoặc người truy cập được xác định bằng cách sử dụnggettừ khóa. Bộ định hình hoặc bộ đột biến được xác định bằng cách sử dụngset từ khóa.
Một getter / setter mặc định được liên kết với mọi lớp. Tuy nhiên, những cái mặc định có thể bị ghi đè bằng cách xác định rõ ràng một setter / getter. Một getter không có tham số và trả về một giá trị, và setter có một tham số và không trả về giá trị.
Cú pháp: Định nghĩa một getter
Return_type get identifier
{
}
Cú pháp: Định nghĩa một bộ định giá
set identifier
{
}
Thí dụ
Ví dụ sau cho thấy cách bạn có thể sử dụng getters và setters trong một lớp học Dart -
class Student {
String name;
int age;
String get stud_name {
return name;
}
void set stud_name(String name) {
this.name = name;
}
void set stud_age(int age) {
if(age<= 0) {
print("Age should be greater than 5");
} else {
this.age = age;
}
}
int get stud_age {
return age;
}
}
void main() {
Student s1 = new Student();
s1.stud_name = 'MARK';
s1.stud_age = 0;
print(s1.stud_name);
print(s1.stud_age);
}
Mã chương trình này sẽ tạo ra những điều sau output -
Age should be greater than 5
MARK
Null
Kế thừa giai cấp
Dart ủng hộ khái niệm Kế thừa là khả năng của một chương trình để tạo các lớp mới từ một lớp hiện có. Lớp được mở rộng để tạo các lớp mới hơn được gọi là lớp cha / siêu lớp. Các lớp mới tạo được gọi là lớp con / lớp con.
Một lớp kế thừa từ một lớp khác bằng cách sử dụng từ khóa 'expand'. Child classes inherit all properties and methods except constructors from the parent class.
Cú pháp
class child_class_name extends parent_class_name
Note - Dart không hỗ trợ đa kế thừa.
Ví dụ: Kế thừa lớp
Trong ví dụ sau, chúng tôi đang khai báo một lớp Shape. Lớp học được mở rộng bởiCirclelớp học. Vì có mối quan hệ kế thừa giữa các lớp nên lớp con, tức là lớpCar nhận được quyền truy cập ngầm vào thành viên dữ liệu lớp cha của nó.
void main() {
var obj = new Circle();
obj.cal_area();
}
class Shape {
void cal_area() {
print("calling calc area defined in the Shape class");
}
}
class Circle extends Shape {}
Nó sẽ tạo ra những thứ sau output -
calling calc area defined in the Shape class
Các loại thừa kế
Thừa kế có thể thuộc ba loại sau:
Single - Mỗi lớp có thể mở rộng nhiều nhất từ một lớp cha.
Multiple- Một lớp có thể kế thừa từ nhiều lớp. Dart không hỗ trợ đa kế thừa.
Multi-level - Một lớp có thể kế thừa từ một lớp con khác.
Thí dụ
Ví dụ sau đây cho thấy cách hoạt động của kế thừa đa cấp:
void main() {
var obj = new Leaf();
obj.str = "hello";
print(obj.str);
}
class Root {
String str;
}
class Child extends Root {}
class Leaf extends Child {}
//indirectly inherits from Root by virtue of inheritance
Lớp Leaflấy các thuộc tính từ các lớp Root và Child nhờ kế thừa đa cấp. Nó làoutput như sau -
hello
Dart - Kế thừa Lớp học và Ghi đè Phương pháp
Ghi đè phương thức là một cơ chế mà lớp con định nghĩa lại một phương thức trong lớp cha của nó. Ví dụ sau minh họa tương tự -
Thí dụ
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(int b) { print("value of b ${b}");
}
}
Nó sẽ tạo ra những thứ sau output -
value of b 12
Số lượng và kiểu của các tham số hàm phải khớp trong khi ghi đè phương thức. Trong trường hợp số lượng tham số hoặc kiểu dữ liệu của chúng không khớp, trình biên dịch Dart sẽ thông báo lỗi. Hình minh họa sau đây giải thích tương tự -
import 'dart:io';
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
void m1(int a){ print("value of a ${a}");} } class Child extends Parent { @override void m1(String b) { print("value of b ${b}");
}
}
Nó sẽ tạo ra những thứ sau output -
value of b 12
Từ khóa tĩnh
Các static từ khóa có thể được áp dụng cho các thành viên dữ liệu của một lớp, tức là, fields và methods. Một biến tĩnh vẫn giữ các giá trị của nó cho đến khi chương trình kết thúc quá trình thực thi. Các thành viên tĩnh được tham chiếu bởi tên lớp.
Thí dụ
class StaticMem {
static int num;
static disp() {
print("The value of num is ${StaticMem.num}") ;
}
}
void main() {
StaticMem.num = 12;
// initialize the static variable }
StaticMem.disp();
// invoke the static method
}
Nó sẽ tạo ra những thứ sau output -
The value of num is 12
Từ khóa siêu cấp
Các supertừ khóa được sử dụng để tham chiếu đến lớp cha trực tiếp của một lớp. Từ khóa có thể được sử dụng để chỉ phiên bản siêu cấp của mộtvariable, property, hoặc là method. Ví dụ sau minh họa tương tự -
Thí dụ
void main() {
Child c = new Child();
c.m1(12);
}
class Parent {
String msg = "message variable from the parent class";
void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
@override
void m1(int b) {
print("value of b ${b}"); super.m1(13); print("${super.msg}") ;
}
}
Nó sẽ tạo ra những thứ sau output -
value of b 12
value of a 13
message variable from the parent class
Lập trình hướng đối tượng định nghĩa một đối tượng là “bất kỳ thực thể nào có ranh giới xác định”. Một đối tượng có những điều sau:
State- Tả đồ vật. Các trường của một lớp đại diện cho trạng thái của đối tượng.
Behavior - Mô tả những gì một đối tượng có thể làm.
Identity- Một giá trị duy nhất để phân biệt một đối tượng với một tập hợp các đối tượng tương tự khác. Hai hoặc nhiều đối tượng có thể chia sẻ trạng thái và hành vi nhưng không chia sẻ danh tính.
Toán tử chu kỳ (.) được sử dụng cùng với đối tượng để truy cập các thành viên dữ liệu của một lớp.
Thí dụ
Dart đại diện cho dữ liệu dưới dạng các đối tượng. Mọi lớp trong Dart đều mở rộng lớp Đối tượng. Dưới đây là một ví dụ đơn giản về việc tạo và sử dụng một đối tượng.
class Student {
void test_method() {
print("This is a test method");
}
void test_method1() {
print("This is a test method1");
}
}
void main() {
Student s1 = new Student();
s1.test_method();
s1.test_method1();
}
Nó sẽ tạo ra những thứ sau output -
This is a test method
This is a test method1
Toán tử Cascade (..)
Ví dụ trên gọi các phương thức trong lớp. Tuy nhiên, mỗi khi một hàm được gọi, một tham chiếu đến đối tượng là bắt buộc. Cáccascade operator có thể được sử dụng như một cách viết tắt trong trường hợp có một chuỗi các lệnh gọi.
Toán tử cascade (..) có thể được sử dụng để đưa ra một chuỗi các cuộc gọi thông qua một đối tượng. Ví dụ trên có thể được viết lại theo cách sau.
class Student {
void test_method() {
print("This is a test method");
}
void test_method1() {
print("This is a test method1");
}
}
void main() {
new Student()
..test_method()
..test_method1();
}
Nó sẽ tạo ra những thứ sau output -
This is a test method
This is a test method1
Phương thức toString ()
Hàm này trả về một biểu diễn chuỗi của một đối tượng. Hãy xem ví dụ sau để hiểu cách sử dụngtoString phương pháp.
void main() {
int n = 12;
print(n.toString());
}
Nó sẽ tạo ra những thứ sau output -
12
Không giống như các ngôn ngữ lập trình khác, Dart không hỗ trợ mảng. Bộ sưu tập phi tiêu có thể được sử dụng để sao chép cấu trúc dữ liệu giống như một mảng. Thư viện lõi dart: và các lớp khác cho phép hỗ trợ Bộ sưu tập trong các tập lệnh Dart.
Bộ sưu tập phi tiêu về cơ bản có thể được phân loại thành -
Sr.No | Bộ sưu tập và mô tả phi tiêu |
---|---|
1 | Danh sách Danh sách chỉ đơn giản là một nhóm các đối tượng có thứ tự. Cácdart:core thư viện cung cấp lớp Danh sách cho phép tạo và thao tác với danh sách.
|
2 | Bộ Tập hợp đại diện cho một tập hợp các đối tượng trong đó mỗi đối tượng chỉ có thể xuất hiện một lần. Thư viện dart: core cung cấp lớp Set để triển khai tương tự. |
3 | Bản đồ Đối tượng Bản đồ là một cặp khóa / giá trị đơn giản. Các khóa và giá trị trong bản đồ có thể thuộc bất kỳ loại nào. Bản đồ là một tập hợp động. Nói cách khác, Bản đồ có thể phát triển và thu nhỏ trong thời gian chạy. Lớp Bản đồ trong thư viện lõi dart: cung cấp hỗ trợ cho cùng một. |
4 | Xếp hàng Hàng đợi là một tập hợp có thể được thao tác ở cả hai đầu. Hàng đợi hữu ích khi bạn muốn tạo bộ sưu tập nhập trước, xuất trước. Nói một cách đơn giản, một hàng đợi sẽ chèn dữ liệu từ một đầu và xóa từ một đầu khác. Các giá trị được xóa / đọc theo thứ tự chèn của chúng. |
Lặp lại các Bộ sưu tập
Lớp Iterator từ dart:corethư viện cho phép truyền tải bộ sưu tập dễ dàng. Mỗi bộ sưu tập đều cóiteratorbất động sản. Thuộc tính này trả về một trình lặp trỏ đến các đối tượng trong bộ sưu tập.
Thí dụ
Ví dụ sau minh họa việc duyệt qua một tập hợp bằng cách sử dụng một đối tượng vòng lặp.
import 'dart:collection';
void main() {
Queue numQ = new Queue();
numQ.addAll([100,200,300]);
Iterator i= numQ.iterator;
while(i.moveNext()) {
print(i.current);
}
}
Các moveNext()hàm trả về giá trị Boolean cho biết liệu có mục nhập tiếp theo hay không. Cáccurrent thuộc tính của đối tượng vòng lặp trả về giá trị của đối tượng mà trình vòng lặp hiện trỏ đến.
Chương trình này sẽ tạo ra những điều sau output -
100
200
300
Phi tiêu là một optionally typed language. Các bộ sưu tập trong Dart không đồng nhất theo mặc định. Nói cách khác, một bộ sưu tập Dart duy nhất có thể lưu trữ các giá trị thuộc nhiều loại khác nhau. Tuy nhiên, một bộ sưu tập Dart có thể được thực hiện để giữ các giá trị đồng nhất. Khái niệm Generics có thể được sử dụng để đạt được điều tương tự.
Việc sử dụng Generics thực thi một giới hạn đối với kiểu dữ liệu của các giá trị mà bộ sưu tập có thể chứa. Các bộ sưu tập như vậy được gọi là bộ sưu tập kiểu an toàn. An toàn kiểu là một tính năng lập trình đảm bảo rằng một khối bộ nhớ chỉ có thể chứa dữ liệu của một kiểu dữ liệu cụ thể.
Tất cả các bộ sưu tập Dart đều hỗ trợ triển khai an toàn kiểu thông qua generic. Một cặp dấu ngoặc nhọn chứa kiểu dữ liệu được sử dụng để khai báo tập hợp kiểu an toàn. Cú pháp để khai báo tập hợp kiểu an toàn như được đưa ra bên dưới.
Cú pháp
Collection_name <data_type> identifier= new Collection_name<data_type>
Các cách triển khai Danh sách, Bản đồ, Tập hợp và Hàng đợi an toàn kiểu được đưa ra bên dưới. Tính năng này cũng được hỗ trợ bởi tất cả các triển khai của các loại bộ sưu tập nêu trên.
Ví dụ: Danh sách chung
void main() {
List <String> logTypes = new List <String>();
logTypes.add("WARNING");
logTypes.add("ERROR");
logTypes.add("INFO");
// iterating across list
for (String type in logTypes) {
print(type);
}
}
Nó sẽ tạo ra những thứ sau output -
WARNING
ERROR
INFO
Cố gắng chèn một giá trị khác với kiểu được chỉ định sẽ dẫn đến lỗi biên dịch. Ví dụ sau đây minh họa điều này.
Thí dụ
void main() {
List <String> logTypes = new List <String>();
logTypes.add(1);
logTypes.add("ERROR");
logTypes.add("INFO");
//iterating across list
for (String type in logTypes) {
print(type);
}
}
Nó sẽ tạo ra những thứ sau output -
1
ERROR
INFO
Ví dụ: Tập hợp chung
void main() {
Set <int>numberSet = new Set<int>();
numberSet.add(100);
numberSet.add(20);
numberSet.add(5);
numberSet.add(60);
numberSet.add(70);
// numberSet.add("Tom");
compilation error;
print("Default implementation :${numberSet.runtimeType}");
for(var no in numberSet) {
print(no);
}
}
Nó sẽ tạo ra những thứ sau output -
Default implementation :_CompactLinkedHashSet<int>
100
20
5
60
70
Ví dụ: Hàng đợi Chung
import 'dart:collection';
void main() {
Queue<int> queue = new Queue<int>();
print("Default implementation ${queue.runtimeType}");
queue.addLast(10);
queue.addLast(20);
queue.addLast(30);
queue.addLast(40);
queue.removeFirst();
for(int no in queue){
print(no);
}
}
Nó sẽ tạo ra những thứ sau output -
Default implementation ListQueue<int>
20
30
40
Bản đồ chung
Một khai báo bản đồ an toàn kiểu chỉ định các kiểu dữ liệu của -
- Chìa khóa
- Giá trị
Cú pháp
Map <Key_type, value_type>
Thí dụ
void main() {
Map <String,String>m={'name':'Tom','Id':'E1001'};
print('Map :${m}');
}
Nó sẽ tạo ra những thứ sau output -
Map :{name: Tom, Id: E1001}
Gói là một cơ chế để đóng gói một nhóm các đơn vị lập trình. Đôi khi, các ứng dụng có thể cần tích hợp một số thư viện hoặc plugin của bên thứ ba. Mọi ngôn ngữ đều có cơ chế quản lý các gói bên ngoài như Maven hoặc Gradle cho Java, Nuget cho .NET, npm cho Node.js, v.v. Trình quản lý gói cho Dart làpub.
Pub giúp cài đặt các gói trong kho. Có thể tìm thấy kho lưu trữ các gói được lưu trữ tạihttps://pub.dartlang.org/.
Các package metadata được xác định trong một tệp, pubsec.yaml. YAML là từ viết tắt củaYet Another Markup Language. Cácpub công cụ có thể được sử dụng để tải xuống tất cả các thư viện khác nhau mà một ứng dụng yêu cầu.
Mọi ứng dụng Dart đều có pubspec.yaml tệp chứa các phần phụ thuộc của ứng dụng vào các thư viện khác và siêu dữ liệu của các ứng dụng như tên ứng dụng, tác giả, phiên bản và mô tả.
Nội dung của một pubspec.yaml tệp sẽ trông giống như thế này -
name: 'vector_victor'
version: 0.0.1
description: An absolute bare-bones web app.
...
dependencies: browser: '>=0.10.0 <0.11.0'
Tầm quan trọng pub commands như sau -
Sr.No | Lệnh & Mô tả |
---|---|
1 | ‘pub get’ Giúp lấy tất cả các gói mà ứng dụng của bạn phụ thuộc vào. |
2 | ‘pub upgrade’ Nâng cấp tất cả các phụ thuộc của bạn lên phiên bản mới hơn. |
3 | ‘pub build’ Điều này được sử dụng để xây dựng ứng dụng web của bạn và nó sẽ tạo một thư mục xây dựng, với tất cả các tập lệnh liên quan trong đó. |
4 | ‘pub help’ Điều này sẽ cung cấp cho bạn trợ giúp cho tất cả các lệnh quán rượu khác nhau. |
Nếu bạn đang sử dụng IDE như WebStorm, thì bạn có thể nhấp chuột phải vào pubspec.yaml để nhận trực tiếp tất cả các lệnh -
Cài đặt gói
Hãy xem xét một ví dụ trong đó một ứng dụng cần phân tích cú pháp xml. Dart XML là một thư viện nhẹ mã nguồn mở và ổn định để phân tích cú pháp, duyệt, truy vấn và xây dựng các tài liệu XML.
Các bước để đạt được nhiệm vụ nói trên như sau:
Step 1 - Thêm phần sau vào tệp pubsec.yaml.
name: TestApp
version: 0.0.1
description: A simple console application.
#dependencies:
# foo_bar: '>=1.0.0 <2.0.0'
dependencies: https://mail.google.com/mail/u/0/images/cleardot.gif
xml:
Nhấp chuột phải vào pubsec.yamlvà nhận các phụ thuộc. Điều này sẽ kích hoạt nội bộpub get command như hình bên dưới.
Các gói đã tải xuống và các gói phụ thuộc của nó có thể được xác minh trong thư mục gói.
Vì cài đặt đã hoàn tất bây giờ, chúng tôi cần tham khảo dart xmlTrong dự án. Cú pháp như sau:
import 'package:xml/xml.dart' as xml;
Đọc chuỗi XML
Để đọc chuỗi XML và xác minh đầu vào, Dart XML sử dụng parse()phương pháp. Cú pháp như sau:
xml.parse(String input):
Ví dụ: Phân tích cú pháp đầu vào chuỗi XML
Ví dụ sau cho thấy cách phân tích cú pháp đầu vào chuỗi XML:
import 'package:xml/xml.dart' as xml;
void main(){
print("xml");
var bookshelfXml = '''<?xml version = "1.0"?>
<bookshelf>
<book>
<title lang = "english">Growing a Language</title>
<price>29.99</price>
</book>
<book>
<title lang = "english">Learning XML</title>
<price>39.95</price>
</book>
<price>132.00</price>
</bookshelf>''';
var document = xml.parse(bookshelfXml);
print(document.toString());
}
Nó sẽ tạo ra những thứ sau output -
xml
<?xml version = "1.0"?><bookshelf>
<book>
<title lang = "english">Growing a Language</title>
<price>29.99</price>
</book>
<book>
<title lang = "english">Learning XML</title>
<price>39.95</price>
</book>
<price>132.00</price>
</bookshelf>
Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện một chương trình. Khi một Ngoại lệ xảy ra, dòng bình thường của chương trình bị gián đoạn và chương trình / Ứng dụng kết thúc bất thường.
Các ngoại lệ Dart tích hợp bao gồm:
Sr.No | Ngoại lệ & Mô tả |
---|---|
1 | DeferredLoadException Bị ném khi không tải được thư viện hoãn lại. |
2 | FormatException Ngoại lệ được đưa ra khi một chuỗi hoặc một số dữ liệu khác không có định dạng mong đợi và không thể phân tích cú pháp hoặc xử lý. |
3 | IntegerDivisionByZeroException Ném khi một số bị chia cho số không. |
4 | IOException Lớp cơ sở cho tất cả các ngoại lệ liên quan đến Inupt-Output. |
5 | IsolateSpawnException Ném khi không thể tạo vùng cách ly. |
6 | Timeout Bị ném khi thời gian chờ đã lên lịch xảy ra trong khi chờ kết quả không đồng bộ. |
Mọi ngoại lệ trong Dart là một kiểu con của lớp được xác định trước Exception. Các trường hợp ngoại lệ phải được xử lý để ngăn ứng dụng chấm dứt đột ngột.
Khối thử / bật / bắt
Các trykhối nhúng mã có thể dẫn đến ngoại lệ. Khối bật được sử dụng khi loại ngoại lệ cần được chỉ định. Cáccatch khối được sử dụng khi trình xử lý cần đối tượng ngoại lệ.
Các try khối phải được theo sau bởi chính xác một on / catch khối hoặc một finallykhối (hoặc một trong cả hai). Khi một ngoại lệ xảy ra trong khối thử, điều khiển được chuyển đếncatch.
Các syntax để xử lý một ngoại lệ như được đưa ra bên dưới:
try {
// code that might throw an exception
}
on Exception1 {
// code for handling exception
}
catch Exception2 {
// code for handling exception
}
Sau đây là một số điểm cần nhớ:
Một đoạn mã có thể có nhiều khối on / catch để xử lý nhiều trường hợp ngoại lệ.
Khối on và khối catch bao gồm lẫn nhau, tức là khối try có thể được liên kết với cả khối on và khối catch.
Đoạn mã sau minh họa việc xử lý ngoại lệ trong Dart:
Ví dụ: Sử dụng Khối BẬT
Chương trình sau chia hai số được đại diện bởi các biến x và ytương ứng. Mã ném một ngoại lệ vì nó cố gắng chia cho số không. Cácon block chứa mã để xử lý ngoại lệ này.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
}
Nó sẽ tạo ra những thứ sau output -
Cannot divide by zero
Ví dụ: Sử dụng khối bắt
Trong ví dụ sau, chúng tôi đã sử dụng mã tương tự như trên. Sự khác biệt duy nhất làcatch block(thay vì khối ON) ở đây chứa mã để xử lý ngoại lệ. Tham số củacatch chứa đối tượng ngoại lệ được ném vào thời gian chạy.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
catch(e) {
print(e);
}
}
Nó sẽ tạo ra những thứ sau output -
IntegerDivisionByZeroException
Ví dụ: on… catch
Ví dụ sau đây cho thấy cách sử dụng on...catch khối.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
Nó sẽ tạo ra những thứ sau output -
IntegerDivisionByZeroException
Khối cuối cùng
Các finallykhối bao gồm mã sẽ được thực thi bất kể sự xuất hiện của ngoại lệ. Tùy chọnfinally khối thực thi vô điều kiện sau khi try/on/catch.
Cú pháp để sử dụng finally khối như sau -
try {
// code that might throw an exception
}
on Exception1 {
// exception handling code
}
catch Exception2 {
// exception handling
}
finally {
// code that should always execute; irrespective of the exception
}
Ví dụ sau minh họa việc sử dụng finally khối.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
finally {
print('Finally block executed');
}
}
Nó sẽ tạo ra những thứ sau output -
Cannot divide by zero
Finally block executed
Ném một Ngoại lệ
Các throwtừ khóa được sử dụng để nêu rõ một ngoại lệ. Một ngoại lệ đã nêu ra cần được xử lý để ngăn chương trình thoát đột ngột.
Các syntax để nêu ra một ngoại lệ rõ ràng là -
throw new Exception_name()
Thí dụ
Ví dụ sau đây cho thấy cách sử dụng throw từ khóa để đưa ra một ngoại lệ -
main() {
try {
test_age(-2);
}
catch(e) {
print('Age cannot be negative');
}
}
void test_age(int age) {
if(age<0) {
throw new FormatException();
}
}
Nó sẽ tạo ra những thứ sau output -
Age cannot be negative
Ngoại lệ tùy chỉnh
Như đã chỉ định ở trên, mọi kiểu ngoại lệ trong Dart là một kiểu con của lớp tích hợp Exception. Dart cho phép tạo các ngoại lệ tùy chỉnh bằng cách mở rộng các ngoại lệ hiện có. Cú pháp để xác định một ngoại lệ tùy chỉnh như dưới đây:
Cú pháp: Xác định ngoại lệ
class Custom_exception_Name implements Exception {
// can contain constructors, variables and methods
}
Các Ngoại lệ Tùy chỉnh phải được nêu ra một cách rõ ràng và cũng phải xử lý như vậy trong mã.
Thí dụ
Ví dụ sau đây cho thấy cách xác định và xử lý một ngoại lệ tùy chỉnh.
class AmtException implements Exception {
String errMsg() => 'Amount should be greater than zero';
}
void main() {
try {
withdraw_amt(-1);
}
catch(e) {
print(e.errMsg());
}
finally {
print('Ending requested operation.....');
}
}
void withdraw_amt(int amt) {
if (amt <= 0) {
throw new AmtException();
}
}
Trong đoạn mã trên, chúng tôi đang xác định một ngoại lệ tùy chỉnh, AmtException. Mã tăng ngoại lệ nếu số tiền được truyền không nằm trong phạm vi ngoại trừ. Cácmain hàm bao gồm lời gọi hàm trong try...catch khối.
Mã sẽ tạo ra những điều sau output -
Amount should be greater than zero
Ending requested operation....
Thỉnh thoảng, các nhà phát triển mắc lỗi trong khi viết mã. Một lỗi trong một chương trình được gọi là một lỗi. Quá trình tìm và sửa lỗi được gọi là gỡ lỗi và là một phần bình thường của quá trình phát triển. Phần này bao gồm các công cụ và kỹ thuật có thể giúp bạn thực hiện các tác vụ gỡ lỗi.
Trình chỉnh sửa WebStorm cho phép các điểm ngắt và gỡ lỗi từng bước. Chương trình sẽ ngắt tại điểm mà điểm ngắt được gắn vào. Chức năng này giống như những gì bạn có thể mong đợi từ việc phát triển ứng dụng Java hoặc C #. Bạn có thể xem các biến, duyệt qua ngăn xếp, bước qua và bước vào các lệnh gọi phương thức và hàm, tất cả đều từ Trình chỉnh sửa WebStorm.
Thêm một điểm ngắt
Hãy xem xét đoạn mã sau. (TestString.dart)
void main() {
int a = 10, b = 20, c = 5;
c = c * c * c;
print("$a + $b = ${a+b}");
print("$a%$b = ${a%b}"); // Add a break point here print("$a*$b = ${a*b}");
print("$a/$b = ${a/b}");
print(c);
}
Đến add a breakpoint, bấm vào lề trái để. Trong hình bên dưới, dòng số 7 có một điểm ngắt.
Run the program in debug mode. Trong trình thám hiểm dự án, hãy nhấp chuột phải vào chương trình phi tiêu trong trường hợp của chúng tôi là TestString.dart.
Khi chương trình chạy ở chế độ gỡ lỗi, bạn sẽ nhận được cửa sổ Trình gỡ lỗi như được hiển thị trong ảnh chụp màn hình sau. Tab biến hiển thị giá trị của các biến trong ngữ cảnh hiện tại. Bạn có thể thêm người theo dõi cho các biến cụ thể và lắng nghe các giá trị đó thay đổi bằng cách sử dụng cửa sổ đồng hồ.
Step Into(F7) biểu tượng mũi tên trên menu gỡ lỗi giúp Thực thi mã một câu lệnh tại một thời điểm. Nếu các phương thức chính gọi một chương trình con, thì điều này cũng sẽ đi vào mã chương trình con.
Step over (F8): Nó tương tự như Step Into. Sự khác biệt trong việc sử dụng xảy ra khi câu lệnh hiện tại chứa lời gọi đến chương trình con. Nếu phương thức chính gọi một chương trình con, bước qua sẽ không đi sâu vào chương trình con. nó sẽ bỏ qua chương trình con.
Step Out(Shift + F8): Thực hiện các dòng còn lại của một hàm có điểm thực thi hiện tại. Câu lệnh tiếp theo được hiển thị là câu lệnh theo sau lệnh gọi chương trình con.
Sau khi chạy ở chế độ gỡ lỗi, chương trình đưa ra kết quả sau output -
10 + 20 = 30
10 % 20 = 10
10 * 20 = 200
10 / 20 = 0.5
125
A typedef, hoặc bí danh kiểu hàm, giúp xác định con trỏ tới mã thực thi trong bộ nhớ. Nói một cách đơn giản, mộttypedef có thể được sử dụng như một con trỏ tham chiếu đến một hàm.
Dưới đây là các bước để triển khai typedefs trong một chương trình Dart.
Step 1: Defining a typedef
A typedefcó thể được sử dụng để chỉ định một chữ ký hàm mà chúng ta muốn các hàm cụ thể khớp với nhau. Chữ ký hàm được xác định bởi các tham số của hàm (bao gồm cả kiểu của chúng). Kiểu trả về không phải là một phần của chữ ký hàm. Cú pháp của nó như sau.
typedef function_name(parameters)
Step 2: Assigning a Function to a typedef Variable
Một biến của typedef có thể trỏ đến bất kỳ chức năng nào có cùng chữ ký như typedef. Bạn có thể sử dụng chữ ký sau để gán một chức năng chotypedef Biến đổi.
type_def var_name = function_name
Step 3: Invoking a Function
Các typedefbiến có thể được sử dụng để gọi các hàm. Đây là cách bạn có thể gọi một hàm -
var_name(parameters)
Thí dụ
Bây giờ chúng ta hãy lấy một ví dụ để hiểu thêm về typedef trong Dart.
Đầu tiên, chúng ta hãy xác định một typedef. Ở đây chúng tôi đang xác định một chữ ký hàm. Hàm sẽ nhận hai tham số đầu vào của kiểuinteger. Kiểu trả về không phải là một phần của chữ ký hàm.
typedef ManyOperation(int firstNo , int secondNo); //function signature
Tiếp theo, chúng ta hãy xác định các chức năng. Xác định một số hàm với cùng một chữ ký hàm như củaManyOperation typedef.
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Add result is ${firstNo/second}");
}
Cuối cùng, chúng tôi sẽ gọi hàm qua typedef. Khai báo một biến kiểu ManyOperations. Gán tên hàm cho biến đã khai báo.
ManyOperation oper ;
//can point to any method of same signature
oper = Add;
oper(10,20);
oper = Subtract;
oper(30,20);
oper = Divide;
oper(50,5);
Các operbiến có thể trỏ đến bất kỳ phương thức nào nhận hai tham số nguyên. CácAddtham chiếu của hàm được gán cho biến. Typedefs có thể chuyển đổi các tham chiếu chức năng trong thời gian chạy
Bây giờ chúng ta hãy đặt tất cả các phần lại với nhau và xem chương trình hoàn chỉnh.
typedef ManyOperation(int firstNo , int secondNo);
//function signature
Add(int firstNo,int second){
print("Add result is ${firstNo+second}"); } Subtract(int firstNo,int second){ print("Subtract result is ${firstNo-second}");
}
Divide(int firstNo,int second){
print("Divide result is ${firstNo/second}");
}
Calculator(int a, int b, ManyOperation oper){
print("Inside calculator");
oper(a,b);
}
void main(){
ManyOperation oper = Add;
oper(10,20);
oper = Subtract;
oper(30,20);
oper = Divide;
oper(50,5);
}
Chương trình sẽ tạo ra những điều sau output -
Add result is 30
Subtract result is 10
Divide result is 10.0
Note - Đoạn mã trên sẽ dẫn đến lỗi nếu typedef biến cố gắng trỏ đến một hàm có chữ ký hàm khác.
Thí dụ
Typedefscũng có thể được truyền dưới dạng tham số cho một hàm. Hãy xem xét ví dụ sau:
typedef ManyOperation(int firstNo , int secondNo); //function signature
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}"); } Divide(int firstNo,int second){ print("Divide result is ${firstNo/second}");
}
Calculator(int a,int b ,ManyOperation oper){
print("Inside calculator");
oper(a,b);
}
main(){
Calculator(5,5,Add);
Calculator(5,5,Subtract);
Calculator(5,5,Divide);
}
Nó sẽ tạo ra những thứ sau output -
Inside calculator
Add result is 10
Inside calculator
Subtract result is 0
Inside calculator
Divide result is 1.0
Một thư viện trong ngôn ngữ lập trình đại diện cho một tập hợp các thói quen (tập hợp các lệnh lập trình). Dart có một bộ thư viện tích hợp rất hữu ích để lưu trữ các quy trình thường xuyên được sử dụng. Thư viện Dart bao gồm một tập hợp các lớp, hằng số, hàm, typedef, thuộc tính và ngoại lệ.
Nhập thư viện
Nhập làm cho các thành phần trong thư viện có sẵn cho mã người gọi. Từ khóa nhập được sử dụng để đạt được điều tương tự. Một tệp phi tiêu có thể có nhiều câu lệnh nhập.
Các URI của thư viện Dart được tạo sẵn sử dụng lược đồ dart: để tham chiếu đến một thư viện. Các thư viện khác có thể sử dụng đường dẫn hệ thống tệp hoặc lược đồ package: để chỉ định URI của nó. Các thư viện được cung cấp bởi trình quản lý gói, chẳng hạn như công cụ quán rượu sử dụng gói: lược đồ .
Cú pháp để nhập thư viện trong Dart được đưa ra dưới đây:
import 'URI'
Hãy xem xét đoạn mã sau -
import 'dart:io'
import 'package:lib1/libfile.dart'
Nếu bạn chỉ muốn sử dụng một phần của thư viện, bạn có thể nhập thư viện một cách chọn lọc. Cú pháp tương tự được đưa ra dưới đây:
import 'package: lib1/lib1.dart' show foo, bar;
// Import only foo and bar.
import 'package: mylib/mylib.dart' hide foo;
// Import all names except foo
Dưới đây là một số thư viện thường được sử dụng:
Sr.No | Thư viện & Mô tả |
---|---|
1 | dart:io Hỗ trợ tệp, ổ cắm, HTTP và I / O khác cho các ứng dụng máy chủ. Thư viện này không hoạt động trong các ứng dụng dựa trên trình duyệt. Thư viện này được nhập theo mặc định. |
2 | dart:core Tích hợp các loại, bộ sưu tập và chức năng cốt lõi khác cho mọi chương trình Dart. Thư viện này được nhập tự động. |
3 | dart: math Hằng số và hàm toán học, cộng với một trình tạo số ngẫu nhiên. |
4 | dart: convert Bộ mã hóa và bộ giải mã để chuyển đổi giữa các biểu diễn dữ liệu khác nhau, bao gồm JSON và UTF-8. |
5 | dart: typed_data Danh sách xử lý hiệu quả dữ liệu có kích thước cố định (ví dụ: số nguyên 8 byte không dấu). |
Ví dụ: Nhập và sử dụng Thư viện
Ví dụ sau đây nhập thư viện tích hợp sẵn dart: math. Đoạn mã gọi làsqrt() chức năng từ maththư viện. Hàm này trả về căn bậc hai của một số được truyền cho nó.
import 'dart:math';
void main() {
print("Square root of 36 is: ${sqrt(36)}");
}
Output
Square root of 36 is: 6.0
Đóng gói trong thư viện
Các tập lệnh Dart có thể đặt tiền tố định danh bằng dấu gạch dưới (_) để đánh dấu các thành phần của nó là riêng tư. Nói một cách đơn giản, các thư viện Dart có thể hạn chế quyền truy cập vào nội dung của nó bằng các tập lệnh bên ngoài. Điều này được gọi làencapsulation. Cú pháp tương tự được đưa ra dưới đây:
Cú pháp
_identifier
Thí dụ
Lúc đầu, hãy xác định một thư viện với một chức năng riêng.
library loggerlib;
void _log(msg) {
print("Log method called in loggerlib msg:$msg");
}
Tiếp theo, nhập thư viện
import 'test.dart' as web;
void main() {
web._log("hello from webloggerlib");
}
Đoạn mã trên sẽ dẫn đến lỗi.
Unhandled exception:
No top-level method 'web._log' declared.
NoSuchMethodError: method not found: 'web._log'
Receiver: top-level
Arguments: [...]
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:184)
#1 main (file:///C:/Users/Administrator/WebstormProjects/untitled/Assertion.dart:6:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:261)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Tạo thư viện tùy chỉnh
Dart cũng cho phép bạn sử dụng mã của riêng mình như một thư viện. Tạo một thư viện tùy chỉnh bao gồm các bước sau:
Step 1: Declaring a Library
Để khai báo thư viện một cách rõ ràng, hãy sử dụng library statement. Cú pháp khai báo thư viện như sau:
library library_name
// library contents go here
Step 2: Associating a Library
Bạn có thể liên kết thư viện theo hai cách -
- Trong cùng một thư mục
import 'library_name'
- Từ một thư mục khác
import 'dir/library_name'
Ví dụ: Thư viện tùy chỉnh
Trước tiên, hãy để chúng tôi xác định một thư viện tùy chỉnh, calculator.dart.
library calculator_lib;
import 'dart:math';
//import statement after the libaray statement
int add(int firstNumber,int secondNumber){
print("inside add method of Calculator Library ") ;
return firstNumber+secondNumber;
}
int modulus(int firstNumber,int secondNumber){
print("inside modulus method of Calculator Library ") ;
return firstNumber%secondNumber;
}
int random(int no){
return new Random().nextInt(no);
}
Tiếp theo, chúng tôi sẽ nhập thư viện -
import 'calculator.dart';
void main() {
var num1 = 10;
var num2 = 20;
var sum = add(num1,num2);
var mod = modulus(num1,num2);
var r = random(10);
print("$num1 + $num2 = $sum"); print("$num1 % $num2= $mod");
print("random no $r");
}
Chương trình sẽ tạo ra những điều sau output -
inside add method of Calculator Library
inside modulus method of Calculator Library
10 + 20 = 30
10 % 20= 10
random no 0
Tiền tố thư viện
Nếu bạn nhập hai thư viện có số nhận dạng xung đột, thì bạn có thể chỉ định tiền tố cho một hoặc cả hai thư viện. Sử dụng'as'từ khóa để chỉ định tiền tố. Cú pháp tương tự được đưa ra dưới đây:
Cú pháp
import 'library_uri' as prefix
Thí dụ
Đầu tiên, chúng ta hãy xác định một thư viện: loggerlib.dart.
library loggerlib;
void log(msg){
print("Log method called in loggerlib msg:$msg");
}
Tiếp theo, chúng tôi sẽ xác định một thư viện khác: webloggerlib.dart.
library webloggerlib;
void log(msg){
print("Log method called in webloggerlib msg:$msg");
}
Cuối cùng, chúng tôi sẽ nhập thư viện với một tiền tố.
import 'loggerlib.dart';
import 'webloggerlib.dart' as web;
// prefix avoids function name clashes
void main(){
log("hello from loggerlib");
web.log("hello from webloggerlib");
}
Nó sẽ tạo ra những thứ sau output -
Log method called in loggerlib msg:hello from loggerlib
Log method called in webloggerlib msg:hello from webloggerlib
An asynchronous operation thực thi trong một chuỗi, tách biệt với mainchủ đề ứng dụng. Khi một ứng dụng gọi một phương thức để thực hiện một hoạt động không đồng bộ, ứng dụng có thể tiếp tục thực thi trong khi phương thức không đồng bộ thực hiện nhiệm vụ của nó.
Thí dụ
Hãy lấy một ví dụ để hiểu khái niệm này. Ở đây, chương trình chấp nhận đầu vào của người dùng bằng cách sử dụngIO library.
import 'dart:io';
void main() {
print("Enter your name :");
// prompt for user input
String name = stdin.readLineSync();
// this is a synchronous method that reads user input
print("Hello Mr. ${name}");
print("End of main");
}
Các readLineSync()là một phương pháp đồng bộ. Điều này có nghĩa là việc thực hiện tất cả các hướng dẫn tuân theoreadLineSync() cuộc gọi chức năng sẽ bị chặn cho đến khi readLineSync() phương thức kết thúc thực thi.
Các stdin.readLineSyncchờ đầu vào. Nó dừng theo dõi và không thực thi thêm nữa cho đến khi nhận được đầu vào của người dùng.
Ví dụ trên sẽ dẫn đến kết quả sau output -
Enter your name :
Tom
// reads user input
Hello Mr. Tom
End of main
Trong máy tính, chúng tôi nói một cái gì đó là synchronouskhi nó đợi một sự kiện xảy ra trước khi tiếp tục. Một bất lợi trong cách tiếp cận này là nếu một phần của mã mất quá nhiều thời gian để thực thi, các khối tiếp theo, mặc dù không liên quan, sẽ bị chặn thực thi. Hãy xem xét một máy chủ web phải đáp ứng nhiều yêu cầu cho một tài nguyên.
Một mô hình thực thi đồng bộ sẽ chặn mọi yêu cầu của người dùng khác cho đến khi nó xử lý xong yêu cầu hiện tại. Trong trường hợp này, giống như của một máy chủ web, mọi yêu cầu phải độc lập với những yêu cầu khác. Điều này có nghĩa là, máy chủ web không nên đợi yêu cầu hiện tại thực hiện xong trước khi nó phản hồi yêu cầu từ người dùng khác.
Nói một cách đơn giản, nó phải chấp nhận yêu cầu từ người dùng mới trước khi nhất thiết phải hoàn thành yêu cầu của người dùng trước. Điều này được gọi là không đồng bộ. Lập trình không đồng bộ về cơ bản có nghĩa là không có mô hình lập trình chờ đợi hoặc không chặn. Cácdart:async gói tạo điều kiện triển khai các khối lập trình không đồng bộ trong tập lệnh Dart.
Thí dụ
Ví dụ sau minh họa rõ hơn hoạt động của một khối không đồng bộ.
Step 1 - Tạo một contact.txt tập tin như dưới đây and lưu nó trong thư mục dữ liệu trong dự án hiện tại.
1, Tom
2, John
3, Tim
4, Jane
Step 2 - Viết một chương trình sẽ đọc tệp mà không chặn các phần khác của ứng dụng.
import "dart:async";
import "dart:io";
void main(){
File file = new File( Directory.current.path+"\\data\\contact.txt");
Future<String> f = file.readAsString();
// returns a futrue, this is Async method
f.then((data)=>print(data));
// once file is read , call back method is invoked
print("End of main");
// this get printed first, showing fileReading is non blocking or async
}
Các output của chương trình này sẽ như sau:
End of main
1, Tom
2, John
3, Tim
4, Jan
"Kết thúc của main" thực thi đầu tiên trong khi tập lệnh tiếp tục đọc tệp. CácFuture lớp học, một phần của dart:async, được sử dụng để lấy kết quả của một phép tính sau khi một tác vụ không đồng bộ đã hoàn thành. Điều nàyFuture giá trị sau đó được sử dụng để làm gì đó sau khi tính toán kết thúc.
Sau khi hoàn thành thao tác đọc, điều khiển thực thi được chuyển trong "then()". Điều này là do thao tác đọc có thể mất nhiều thời gian hơn và vì vậy nó không muốn chặn phần khác của chương trình.
Tương lai phi tiêu
Cộng đồng Dart xác định một Futurelà "phương tiện để nhận giá trị vào một lúc nào đó trong tương lai." Chỉ cần đặt,Future objectslà một cơ chế để đại diện cho các giá trị được trả về bởi một biểu thức mà việc thực thi sẽ hoàn thành vào thời điểm sau đó. Một số lớp tích hợp của Dart trả vềFuture khi một phương thức không đồng bộ được gọi.
Dart là một ngôn ngữ lập trình đơn luồng. Nếu bất kỳ mã nào chặn luồng thực thi (ví dụ: bằng cách chờ thao tác tốn thời gian hoặc chặn trên I / O), chương trình sẽ bị đóng băng một cách hiệu quả.
Hoạt động không đồng bộ cho phép chương trình của bạn chạy mà không bị chặn. Sử dụng phi tiêuFuture objects để biểu diễn các hoạt động không đồng bộ.
Concurrencylà việc thực hiện một số chuỗi lệnh cùng một lúc. Nó liên quan đến việc thực hiện nhiều hơn một nhiệm vụ đồng thời.
Sử dụng phi tiêu Isolatesnhư một công cụ để thực hiện các công việc song song. Cácdart:isolate gói là giải pháp của Dart để lấy mã Dart đơn luồng và cho phép ứng dụng sử dụng nhiều hơn các phần cứng có sẵn.
Isolates, như tên cho thấy, là các đơn vị mã đang chạy biệt lập. Cách duy nhất để gửi dữ liệu giữa chúng là truyền tin nhắn, giống như cách bạn chuyển tin nhắn giữa máy khách và máy chủ. Anisolate giúp chương trình tận dụng lợi thế của các bộ vi xử lý đa lõi.
Thí dụ
Hãy lấy một ví dụ để hiểu rõ hơn khái niệm này.
import 'dart:isolate';
void foo(var message){
print('execution from foo ... the message is :${message}');
}
void main(){
Isolate.spawn(foo,'Hello!!');
Isolate.spawn(foo,'Greetings!!');
Isolate.spawn(foo,'Welcome!!');
print('execution from main1');
print('execution from main2');
print('execution from main3');
}
Đây, spawn phương pháp của Isolate lớp tạo điều kiện cho việc chạy một chức năng, foo, song song với phần còn lại của mã của chúng tôi. Cácspawn hàm nhận hai tham số -
- chức năng được sinh ra, và
- một đối tượng sẽ được chuyển đến hàm được tạo.
Trong trường hợp không có đối tượng nào để truyền cho hàm được tạo, nó có thể được chuyển một giá trị NULL.
Hai chức năng (foo and main)có thể không nhất thiết phải chạy theo cùng một thứ tự mỗi lần. Không có gì đảm bảo khi nàofoo sẽ được thực thi và khi nào main()sẽ được thực thi. Đầu ra sẽ khác nhau mỗi khi bạn chạy.
Đầu ra 1
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Hello!!
Đầu ra 2
execution from main1
execution from main2
execution from main3
execution from foo ... the message is :Welcome!!
execution from foo ... the message is :Hello!!
execution from foo ... the message is :Greetings!!
Từ kết quả đầu ra, chúng ta có thể kết luận rằng mã Dart có thể tạo ra một isolate từ việc chạy mã như cách mã Java hoặc C # có thể bắt đầu một chuỗi mới.
Isolates khác với chủ đề ở chỗ isolatecó bộ nhớ riêng của nó. Không có cách nào để chia sẻ một biến giữaisolates—Cách duy nhất để giao tiếp giữa isolates là thông qua tin nhắn đi qua.
Note - Kết quả đầu ra trên sẽ khác nhau đối với các cấu hình phần cứng và hệ điều hành khác nhau.
Cô lập v / s Tương lai
Thực hiện công việc tính toán phức tạp không đồng bộ là điều quan trọng để đảm bảo khả năng đáp ứng của các ứng dụng. Dart Future là một cơ chế để truy xuất giá trị của một tác vụ không đồng bộ sau khi nó đã hoàn thành, trong khi Dart Isolates là một công cụ để trừu tượng hóa song song và thực hiện nó trên cơ sở thực tế cấp cao.
Unit Testing liên quan đến việc kiểm tra từng đơn vị riêng lẻ của một ứng dụng. Nó giúp nhà phát triển kiểm tra các chức năng nhỏ mà không cần chạy toàn bộ ứng dụng phức tạp.
Phi tiêu external library có tên "test" cung cấp cách viết và chạy các bài kiểm tra đơn vị chuẩn.
Kiểm tra đơn vị phi tiêu bao gồm các bước sau:
Step 1: Installing the "test" package
Để cài đặt các gói của bên thứ ba trong dự án hiện tại, bạn sẽ yêu cầu pubspec.yamltập tin. Để cài đặttest packages, trước tiên hãy thực hiện mục nhập sau trong pubspec.yaml tập tin -
dependencies:
test:
Sau khi nhập, nhấp chuột phải vào pubspec.yamltệp và nhận các phụ thuộc. Nó sẽ cài đặt"test"gói hàng. Dưới đây là một ảnh chụp màn hình cho cùng một trongWebStorm Biên tập viên.
Các gói có thể được cài đặt từ command linequá. Nhập nội dung sau vào thiết bị đầu cuối -
pub get
Step 2: Importing the "test" package
import "package:test/test.dart";
Step 3 Writing Tests
Kiểm tra được chỉ định bằng cách sử dụng chức năng cấp cao nhất test(), trong khi test assertions được tạo ra bằng cách sử dụng expect()chức năng. Để sử dụng các phương pháp này, chúng phải được cài đặt dưới dạngpub sự phụ thuộc.
Cú pháp
test("Description of the test ", () {
expect(actualValue , matchingValue)
});
Các group()chức năng có thể được sử dụng để nhóm các bài kiểm tra. Mô tả của mỗi nhóm được thêm vào đầu mô tả của thử nghiệm.
Cú pháp
group("some_Group_Name", () {
test("test_name_1", () {
expect(actual, equals(exptected));
});
test("test_name_2", () {
expect(actual, equals(expected));
});
})
Ví dụ 1: Bài kiểm tra vượt qua
Ví dụ sau định nghĩa một phương thức Add(). Phương thức này nhận hai giá trị số nguyên và trả về một số nguyên đại diện chosum. Để kiểm tra điều nàyadd() phương pháp -
Step 1 - Nhập test gói như được đưa ra bên dưới.
Step 2 - Xác định bài kiểm tra bằng cách sử dụng test()chức năng. Đây,test() chức năng sử dụng expect() chức năng để thực thi một khẳng định.
import 'package:test/test.dart';
// Import the test package
int Add(int x,int y)
// Function to be tested {
return x+y;
}
void main() {
// Define the test
test("test to check add method",(){
// Arrange
var expected = 30;
// Act
var actual = Add(10,20);
// Asset
expect(actual,expected);
});
}
Nó sẽ tạo ra những thứ sau output -
00:00 +0: test to check add method
00:00 +1: All tests passed!
Ví dụ 2: Kiểm tra Không đạt
Các subtract()phương pháp được định nghĩa dưới đây có một sai lầm logic. Sautest xác minh tương tự.
import 'package:test/test.dart';
int Add(int x,int y){
return x+y;
}
int Sub(int x,int y){
return x-y-1;
}
void main(){
test('test to check sub',(){
var expected = 10;
// Arrange
var actual = Sub(30,20);
// Act
expect(actual,expected);
// Assert
});
test("test to check add method",(){
var expected = 30;
// Arrange
var actual = Add(10,20);
// Act
expect(actual,expected);
// Asset
});
}
Output - Trường hợp thử nghiệm cho chức năng add() vượt qua nhưng bài kiểm tra cho subtract() không thành công như hình dưới đây.
00:00 +0: test to check sub
00:00 +0 -1: test to check sub
Expected: <10>
Actual: <9>
package:test expect
bin\Test123.dart 18:5 main.<fn>
00:00 +0 -1: test to check add method
00:00 +1 -1: Some tests failed.
Unhandled exception:
Dummy exception to set exit code.
#0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:938)
#1 _microtaskLoop (dart:async/schedule_microtask.dart:41)
#2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50)
#3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:394)
#4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
Nhóm các trường hợp kiểm tra
Bạn có thể nhóm test casesđể nó bổ sung thêm ý nghĩa cho mã kiểm tra của bạn. Nếu bạn có nhiềutest cases điều này giúp viết mã sạch hơn nhiều.
Trong đoạn mã đã cho, chúng tôi đang viết một trường hợp thử nghiệm cho split() chức năng và trimchức năng. Do đó, chúng tôi nhóm các trường hợp thử nghiệm này một cách hợp lý và gọi nó làString.
Thí dụ
import "package:test/test.dart";
void main() {
group("String", () {
test("test on split() method of string class", () {
var string = "foo,bar,baz";
expect(string.split(","), equals(["foo", "bar", "baz"]));
});
test("test on trim() method of string class", () {
var string = " foo ";
expect(string.trim(), equals("foo"));
});
});
}
Output - Đầu ra sẽ thêm tên nhóm cho mỗi trường hợp thử nghiệm như được đưa ra bên dưới -
00:00 +0: String test on split() method of string class
00:00 +1: String test on trim() method of string class
00:00 +2: All tests passed
Mỗi trang web nằm bên trong cửa sổ trình duyệt có thể được coi là một đối tượng.
A Document objectđại diện cho tài liệu HTML được hiển thị trong cửa sổ đó. Đối tượng Document có nhiều thuộc tính tham chiếu đến các đối tượng khác cho phép truy cập và sửa đổi nội dung tài liệu.
Cách nội dung tài liệu được truy cập và sửa đổi được gọi là Document Object Model, hoặc là DOM. Các Đối tượng được tổ chức theo một hệ thống phân cấp. Cấu trúc phân cấp này áp dụng cho việc tổ chức các đối tượng trong tài liệu Web.
Window- Đứng đầu hệ thống phân cấp. Nó là phần tử ngoài cùng của hệ thống phân cấp đối tượng.
Document- Mỗi tài liệu HTML được tải vào một cửa sổ sẽ trở thành một đối tượng tài liệu. Tài liệu chứa nội dung của trang.
Elements- đại diện cho nội dung trên một trang web. Ví dụ bao gồm các hộp văn bản, tiêu đề trang, v.v.
Nodes - thường là các phần tử, nhưng chúng cũng có thể là thuộc tính, văn bản, nhận xét và các loại DOM khác.
Đây là một cấu trúc phân cấp đơn giản của một vài đối tượng DOM quan trọng -
Dart cung cấp dart:htmlthư viện để thao tác các đối tượng và phần tử trong DOM. Các ứng dụng dựa trên bảng điều khiển không thể sử dụngdart:htmlthư viện. Để sử dụng thư viện HTML trong các ứng dụng web, hãy nhậpdart:html -
import 'dart:html';
Tiếp tục, chúng ta sẽ thảo luận về một số DOM Operations trong phần tiếp theo.
Tìm các phần tử DOM
Các dart:html thư viện cung cấp querySelector chức năng tìm kiếm các phần tử trong DOM.
Element querySelector(String selectors);
Các querySelector() hàm trả về phần tử đầu tiên phù hợp với nhóm bộ chọn được chỉ định. "selectors phải là chuỗi sử dụng cú pháp bộ chọn CSS như được cung cấp bên dưới
var element1 = document.querySelector('.className');
var element2 = document.querySelector('#id');
Ví dụ: Thao tác DOM
Thực hiện theo các bước được cung cấp bên dưới, trong IDE Webstorm -
Step 1 - File NewProject → Trong vị trí, cung cấp tên dự án là DemoWebApp.
Step 1 - Trong phần "Tạo nội dung mẫu", chọn SimpleWebApplication.
Nó sẽ tạo ra một dự án mẫu, DemoWebApp. Đây là mộtpubspec.yaml tệp chứa các phần phụ thuộc cần được tải xuống.
name: 'DemoWebApp'
version: 0.0.1
description: An absolute bare-bones web app.
#author: Your Name <[email protected]>
#homepage: https://www.example.com
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
browser: '>=0.10.0 <0.11.0' dart_to_js_script_rewriter: '^1.0.1'
transformers:
- dart_to_js_script_rewriter
Nếu bạn được kết nối với Web, thì chúng sẽ được tải xuống tự động, nếu không, bạn có thể nhấp chuột phải vào pubspec.yaml và nhận các phụ thuộc.
Trong thư mục web, bạn sẽ tìm thấy ba tệp: Index.html, main.dartvà style.css
Index.html
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
<meta name = "scaffolded-by" content = "https://github.com/google/stagehand">
<title>DemoWebApp</title>
<link rel = "stylesheet" href = "styles.css">
<script defer src = "main.dart" type = "application/dart"></script>
<script defer src = "packages/browser/dart.js"></script>
</head>
<body>
<h1>
<div id = "output"></div>
</h1>
</body>
</html>
Main.dart
import 'dart:html';
void main() {
querySelector('#output').text = 'Your Dart web dom app is running!!!.';
}
Chạy index.htmltập tin; bạn sẽ thấy kết quả sau trên màn hình của mình.
Xử lý sự kiện
Các dart:html thư viện cung cấp onClicksự kiện cho Phần tử DOM. Cú pháp cho biết cách một phần tử có thể xử lý luồng sự kiện nhấp chuột.
querySelector('#Id').onClick.listen(eventHanlderFunction);
Các querySelector() hàm trả về phần tử từ DOM đã cho và onClick.listen() sẽ mất một eventHandlerphương thức này sẽ được gọi khi một sự kiện nhấp chuột được đưa ra. Cú pháp củaeventHandler được đưa ra dưới đây -
void eventHanlderFunction (MouseEvent event){ }
Bây giờ chúng ta hãy lấy một ví dụ để hiểu khái niệm Xử lý sự kiện trong Dart.
TestEvent.html
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
<meta name = "scaffolded-by" content ="https://github.com/google/stagehand">
<title>DemoWebApp</title>
<link rel = "stylesheet" href = "styles.css">
<script defer src = "TestEvent.dart" type="application/dart"></script>
<script defer src = "packages/browser/dart.js"></script>
</head>
<body>
<div id = "output"></div>
<h1>
<div>
Enter you name : <input type = "text" id = "txtName">
<input type = "button" id = "btnWish" value="Wish">
</div>
</h1>
<h2 id = "display"></h2>
</body>
</html>
TestEvent.dart
import 'dart:html';
void main() {
querySelector('#btnWish').onClick.listen(wishHandler);
}
void wishHandler(MouseEvent event){
String name = (querySelector('#txtName') as InputElement).value;
querySelector('#display').text = 'Hello Mr.'+ name;
}