CHƯƠNG 1. Tổng quan về ngôn ngữ lập trình Dart Dart là ngôn ngữ lập trình cho Flutter - bộ công cụ giao diện người dùng của Google để xây dựng các ứng dụng Mobile, Web và Desktop app đẹp, được biên dịch nguyên bản từ một cơ sở mã code duy nhất. Cú pháp Dart rõ ràng và súc tích, công cụ của nó đơn giản nhưng mạnh mẽ. Type- safe giúp bạn xác định sớm các lỗi tinh tế.
Dart có các thư viện cốt lõi và một hệ sinh thái gồm hàng ngàn package. Dart cung cấp tối ưu hóa việc biên dịch trước thời hạn để có được dự đoán hiệu suất cao và khởi động nhanh trên các thiết bị di động và web. Dart biên dịch thành mã ARM và x86, để các ứng dụng di động của Dart có thể chạy tự nhiên trên iOS, Android và hơn thế nữa. Đối với các ứng dụng web, chuyển mã từ Dart sang JavaScript.
Dart quen thuộc với nhiều nhà phát triển hiện có, nhờ vào cú pháp và định hướng đối tượng không gây ngạc nhiên của nó. Nếu bạn đã biết C ++, C # hoặc Java, bạn có thể làm việc hiệu quả với Dart chỉ sau vài ngày. Dart rất phù hợp với lập trình Reactive, với sự hỗ trợ để quản lý các đối tượng tồn tại trong thời gian ngắn, chẳng hạn như các widget UI, thông qua phân bổ đối tượng nhanh và GC. Dart hỗ trợ lập trình không đồng bộ thông qua các tính năng ngôn ngữ và API sử dụng các đối tượng Future và Stream.
Dịch vụ cơ sở dữ liệu Firebase Firebase là dịch vụ cơ sở dữ liệu hoạt động trên nền tảng đám mây – cloud, kèm theo đó là hệ thống máy chủ cực kỳ mạnh mẽ của Google. Chức năng chính là giúp người dùng lập trình ứng dụng bằng cách đơn giản hóa các thao tác với cơ sở dữ liệu. SVTH: Lê Thị Trúc Vy Trang 4 Xây dựng ứng dụng quản lý đặt nước uống tại quán Sahami ở thành phố Đà Nẵng Cụ thể là những giao diện lập trình ứng dụng API đơn giản. Mục đích nhằm tăng số lượng người dùng và thu lại nhiều lợi nhuận hơn.
Khi đăng ký một tài khoản trên Firebase để tạo ứng dụng, bạn đã có một cơ sở dữ liệu thời gian thực. Dữ liệu bạn nhận được dưới dạng JSON. Đồng thời nó cũng luôn được đồng bộ thời gian thực đến mọi kết nối client. Đối với các ứng dụng đa nền tảng, tất cả các client đều sử dụng cùng một cơ sở dữ liệu.
Nó được tự động cập nhật dữ liệu mới nhất bất cứ khi nào các lập trình viên phát triển ứng dụng. Cuối cùng, tất cả các dữ liệu này được truyền qua kết nối an toàn SSL có bảo mật với chứng nhận 2048 bit. Trong trường hợp bị mất mạng, dữ liệu được lưu lại ở local. Vì thế khi có mọi sự thay đổi nào đều được tự động cập nhật lên Server của Firebase.
Bên cạnh đó, đối với các dữ liệu ở local cũ hơn với Server thì cũng tự động cập nhật để được dữ liệu mới nhất. Framework và thư viện hỗ trợ Giới thiệu Flutter Framework Flutter là UI Framework mã nguồn mở dành cho di động, miễn phí được tạo bởi Google và phát hành vào tháng 5 năm 2017. Nó được sử dụng để phát triển các ứng dụng đa nền tảng cho Android, iOS, Linux, macOS, Windows, Google Fuchsia và web từ một codebase duy nhất. Icon Flutter SVTH: Lê Thị Trúc Vy Trang 5 Xây dựng ứng dụng quản lý đặt nước uống tại quán Sahami ở thành phố Đà Nẵng Ưu điểm của Flutter: - Ít phải viết các config khi tạo project mới theo cách thủ công, ngược lại với React Native.
- Chỉ cần tải về Flutter từ git, chạy “flutter doctor”, và nó sẽ cho bạn biết những loại vấn đề bạn có thể có trong hệ thống. Sau đó, tạo một project từ Android Studio hoặc bất kỳ IDE nào sau khi cài đặt Flutter Plug-in sơ bộ và start project. Ngoài ra nó còn có Hot-reload giống như trong React-Native. - Hỗ trợ tuyệt vời cho IDE (Android Studio, IDE IntelliJ, VSCode) - Trình điều hướng tích hợp sẵn.
Sau khi tạo ra một ứng dụng trên Flutter, có thể thấy nó có Navigator được xây dựng sẵn. Có thể tạo một route mới mà không cần kết nối bất kỳ thứ gì (không giống như trong React-Native, kết nối bất kỳ package điều hướng gốc nào, …) - Giải pháp quản lý dữ liệu được tạo sẵn, ví dụ trong Flutter này là "Mọi thứ đều có một Widget" cho nó. Có một StatefulWidget đặc biệt, với sự giúp đỡ của nó mà chúng ta có thể quản lý trạng thái widget và thay đổi nó một cách năng động. Công cụ hỗ trợ xây dựng hệ thống 1.
Android Studio Android Studio cung cấp môi trường phát triển tích hợp (IDE) cho Flutter, với đầy đủ tính năng và công cụ hỗ trợ cho việc phát triển ứng dụng di động Flutter. Nó cung cấp giao diện đồ họa và trình soạn thảo mã nguồn mạnh mẽ, cùng với các tính năng như tìm kiếm và sửa lỗi, tự động hoàn thành mã, và tích hợp công cụ quản lý phiên bản. Android Studio không chỉ hỗ trợ phát triển ứng dụng di động Android mà còn hỗ trợ việc phát triển ứng dụng di động iOS thông qua công cụ Flutter. Điều này cho phép chúng tôi xây dựng ứng dụng đa nền tảng cho cả hai hệ điều hành Android và iOS từ một mã nguồn duy nhất.
Android Studio tích hợp sẵn Git và các công cụ quản lý phiên bản khác, cho phép quản lý mã nguồn và tiến trình phát triển một cách thuận tiện. Hỗ trợ các plugin chính thức của Flutter, cho phép cài đặt và sử dụng các công cụ Flutter một cách dễ dàng. Các plugin này bao gồm Flutter SDK, Flutter Inspector, Flutter DevTools, và nhiều công cụ khác giúp phát triển, kiểm tra và gỡ lỗi ứng dụng Flutter một cách hiệu quả. Flutter Inspector - Gỡ lỗi giao diện người dùng (UI): Flutter Inspector cho phép kiểm tra và gỡ lỗi giao diện người dùng trong ứng dụng Flutter.
Có thể xem các thành phần UI, SVTH: Lê Thị Trúc Vy Trang 6 Xây dựng ứng dụng quản lý đặt nước uống tại quán Sahami ở thành phố Đà Nẵng cây Widget, và thuộc tính của chúng, từ đó dễ dàng phát hiện và khắc phục các vấn đề về giao diện. - Kiểm tra và tối ưu hiệu suất: Flutter Inspector cung cấp thông tin chi tiết về hiệu suất ứng dụng, giúp xác định và sửa lỗi các vấn đề về tốc độ và tài nguyên. Có thể xem thông tin về thời gian xử lý, kích thước Widget, số lượng Widget render, và các thông số quan trọng khác để tối ưu hóa hiệu suất ứng dụng. - Tương tác với Widget và trạng thái ứng dụng: Flutter Inspector cho phép tương tác trực tiếp với các Widget trong ứng dụng, thay đổi trạng thái và các thuộc tính của chúng.
Điều này giúp thử nghiệm và kiểm tra sự phản ứng của ứng dụng trong nhiều trạng thái khác nhau mà không cần phải khởi chạy lại ứng dụng. - Hỗ trợ quản lý và chỉnh sửa layout: Flutter Inspector cung cấp các công cụ để quản lý và chỉnh sửa layout của ứng dụng. Có thể di chuyển, thay đổi kích thước, và sắp xếp các Widget trong cây Widget một cách thuận tiện và trực quan. Ảnh minh họa Adroid Studio 1.
Postman Postman là một công cụ để test API của cty Postdot Technologies, cho phép làm việc với các API, nhất là REST, giúp ích rất nhiều cho việc testing. Hỗ trợ tất cả các phương thức HTTP (GET, POST, PUT, DELETE, OPTIONS, HEAD. Ưu điểm: - Dễ sử dụng, hỗ trợ cả chạy bằng UI và non-UI. SVTH: Lê Thị Trúc Vy Trang 7 Xây dựng ứng dụng quản lý đặt nước uống tại quán Sahami ở thành phố Đà Nẵng - Hỗ trợ viết code cho assert tự động bằng Javascript.
- Hỗ trợ cả RESTful services và SOAP services. - Có chức năng tạo API document. Ảnh minh họa Postman 1. Lý thuyết xây dựng ứng dụng Bên dưới tất cả ứng dụng là một tập các dịch vụ và các hệ thống bao gồm: Một tập hợp các View có thể được mở rộng, được sử dụng để xây dựng các ứng dụng bao gồm các List, Grid, Text Box, Button, … Content Provider: cho phép ứng dụng truy xuất dữ liệu từ ứng dụng khác (Contacts chẳng hạn), hoặc chia sẻ dữ liệu của nó cho các ứng dụng khác.
Resource Manager: cho phép truy cập đến các tài nguyên non-code như là các tập tin layout, hình ảnh, dữ liệu dạng chuỗi được định vị … Notification Manager: cho phép tất cả các ứng dụng hiển thị một thông báo nào đó trên thanh trạng thái. Activity Manager: quản lý vòng đời của ứng dụng và quản lý điều hướng backstack của các Activity trong ứng dụng. Ứng dụng Flutter sử dụng mô hình MVVM (Model - View - ViewModel) Mô hình này khá giống với MVC (Model - View - Controller), sự khác biệt duy nhất là nẳm ở cách xây dựng nên C (Controller) của MVC và VM (ViewModel) của MVVM. Đầu tiên là xây dựng Model trước, sau đó là Repository, ViewModel và cuối cùng là View.
Để lấy dữ liệu của model chúng ta cần một Repository. Các phương thức của Repository trả về một đối tượng Future. Future là một class của Dart, được sử dụng để SVTH: Lê Thị Trúc Vy Trang 8 Xây dựng ứng dụng quản lý đặt nước uống tại quán Sahami ở thành phố Đà Nẵng phục vụ lập trình đa luồng, ví dụ phương thức get trong Repository có thể phải đợi rất lâu mới lấy được dữ liệu, sử dụng Future giống như một dạng callback, nó sẽ trả về dữ liệu khi dữ liệu lấy được thành công. Repository sẽ được sử dụng trong ViewModel và dùng để thao tác với các cơ sở dữ liệu (từ database hoặc api).
Để thao tác dữ liệu trong database, sử dụng thư viện sqflite được cung cấp thông qua Dartlang Package. Với các ứng dụng Android Native, ViewModel sẽ giao tiếp với View thông qua Databinding và LiveData, tuy nhiên Flutter chưa support Databinding hay LiveData, do đó sẽ sử dụng một plugin có tên Scoped Model. Plugin này hỗ trợ việc truyền model từ Widget cha đến các Widget con, khi model cập nhật trạng thái, các Widget con sẽ tự động được build lại, cũng giống với khả năng của LiveData tuy nhiên chúng ta phải tự thông báo trạng thái đến View thay vì để model tự cập nhật chúng. Các function đánh dấu async sẽ thực hiện bất đồng bộ so với luồng chính để đảm bảo UI không bị block, việc lập trình bất đồng bộ theo async await pattern rất dễ dàng do đã được Dart support sẵn, không cần tạo thêm luồng mới, quản lý luồng.
Tiếp theo là xây dựng tầng View. Sử dụng Widget ScopedModel để hỗ trợ việc cập nhật dữ liệu giữa View và ViewModel), ScopedModel này lắng nghe dữ liệu từ ViewModel.