Bối cảnh và vấn đề nghiên cứu

Đồ án tốt nghiệp này được thực hiện tại Khoa Công nghệ Thông tin, Trường Đại học Thái Bình Dương, dưới sự hướng dẫn của TS. Đặng Xuân Bình (tên trong văn bản ghi "Phạm Xuân Bình" ở trang bìa nhưng lời cảm ơn ghi "TS. Đặng Xuân Bình"). Đề tài tập trung vào việc phát triển tính năng tài khoản sinh viên cho ứng dụng TBD — một ứng dụng di động mang tên "Open Day" phục vụ cộng đồng sinh viên của trường.

Lý do chọn đề tài và bối cảnh thực tiễn:
Nhu cầu sử dụng ứng dụng di động ngày càng cao trong bối cảnh hệ điều hành Android chiếm hơn 80% thị trường thiết bị di động. Ứng dụng quản lý sinh viên trên nền tảng di động là xu hướng tất yếu để số hóa hoạt động đào tạo của các trường đại học. Tác giả xác định Flutter — framework đa nền tảng của Google — là lựa chọn phù hợp để xây dựng ứng dụng có thể triển khai đồng thời trên Android và iOS mà không cần viết lại toàn bộ mã nguồn.

Mục đích nghiên cứu:

  1. Củng cố và nắm chắc kiến thức về lập trình di động.
  2. Tạo ra một phần mềm ứng dụng vào thực tế.
  3. Nắm được phương pháp xây dựng một ứng dụng di động.
  4. Tiếp cận ngôn ngữ lập trình mới (Dart).
  5. Nắm được những kiến thức cơ bản về Android Studio.

Nhiệm vụ đề tài:

  • Tìm hiểu về Flutter, cài đặt và biên dịch hệ thống.
  • Tìm hiểu về ứng dụng "Open Day", viết ứng dụng đọc website trên di động, biên dịch lên các thiết bị Android và iOS.
  • Phát triển các tính năng tài khoản sinh viên trong app TBD.

Đối tượng và phạm vi nghiên cứu:
Đối tượng là tập hợp tính năng quản lý tài khoản sinh viên trong ứng dụng di động Open Day của Trường Đại học Thái Bình Dương, bao gồm: đăng nhập, đăng ký, hiển thị thông tin sinh viên, xem học phí và màn hình chính sinh viên. Phạm vi triển khai trên thiết bị Android và iOS; môi trường phát triển chạy trên hệ điều hành Windows.


Cơ sở lý thuyết và phương pháp

Khung công nghệ:
Tác giả sử dụng Flutter — một cross-platform framework của Google viết trên nền ngôn ngữ Dart — làm nền tảng phát triển chính. Flutter được kiến trúc theo hai tầng: tầng Application (sử dụng Dart, hỗ trợ tùy chỉnh mã nguồn tại thời điểm compile time) và tầng Shell (viết bằng C++, chứa máy ảo Dart VM). Toàn bộ giao diện người dùng được xây dựng theo mô hình widget — khái niệm thống nhất thay thế cho Activity (Android) và StoryBoard (iOS).

Ngôn ngữ Dart được Google phát triển, đã được tổ chức Ecma chấp thuận; hỗ trợ lập trình hướng đối tượng, cú pháp kiểu C, biên dịch thành mã ARM và x86 cho di động, biên dịch thành JavaScript cho web. Dart hỗ trợ lập trình bất đồng bộ thông qua Future và Stream.

Backend và cơ sở dữ liệu:
Dự án tích hợp Firebase (dịch vụ backend của Google), trong đó sử dụng các thành phần:

  • Firebase Authentication — xác thực người dùng qua email và mật khẩu.
  • Cloud Firestore — lưu trữ và đồng bộ dữ liệu người dùng (noSQL, lưu trên hạ tầng cloud).
  • Firebase Core — cơ sở hạ tầng kết nối ứng dụng với các dịch vụ Firebase.

Môi trường phát triển:
Android Studio (dựa trên IntelliJ IDEA) được chọn làm IDE chính, tích hợp plugin Flutter. Hệ thống build sử dụng Gradle-based. Thiết bị kiểm thử bao gồm máy tính Windows, điện thoại Android và iOS.

Phương pháp nghiên cứu:

  • Thu thập và tham khảo tài liệu từ các trang web kỹ thuật (flutter.dev, viblo.asia, firebase.com, developer.android.com).
  • Tham khảo tài liệu in: Flutter Fast: 65 Example Apps; khóa học Flutter cơ bản của Cafedev.
  • Tham khảo ý kiến giảng viên hướng dẫn trong quá trình phát triển phần mềm.
  • Xây dựng phần mềm theo phương pháp lập trình thực nghiệm: thiết kế giao diện → lập trình API kết nối Firebase → kiểm thử trên thiết bị thực.

Gói phụ thuộc (dependencies) sử dụng trong pubspec.yaml:

Gói Phiên bản Chức năng
firebase_auth ^4.0 Xác thực người dùng qua Firebase Authentication
firebase_core (có trong văn bản, phiên bản không ghi rõ) Kết nối ứng dụng với dịch vụ Firebase

Nội dung chính theo từng chương

Chương I — Giới thiệu về đề tài

Chương này trình bày lý do lựa chọn Flutter thay vì các framework đa nền tảng khác như React Native hay Ionic. Các luận điểm chính gồm: Flutter chạy ở 60 fps với hiệu suất gần native; hỗ trợ Hot Reload giúp tiết kiệm thời gian xây dựng mà không cần khởi động lại toàn bộ ứng dụng; Flutter không yêu cầu ngôn ngữ tạo giao diện riêng (không cần JSX hay XML); kiến trúc code thống nhất — data, style và template nằm trong cùng một màn hình làm việc.

Chương cũng nêu rõ mục đích nghiên cứu và phương pháp thực hiện đề tài.

Chương II — Cơ sở lý thuyết

Chương trình bày nền tảng lý thuyết gồm ba khối:

Flutter và mô hình widget: Giải thích kiến trúc hai tầng của Flutter (Application layer — Dart; Shell layer — C++, Dart VM). Mô hình project Flutter được mô tả theo cấu trúc phân cấp MaterialApp → Scaffold → AppBar / Column / Row / Center. Phân biệt StatefulWidget (có trạng thái thay đổi được, gọi createState()) và StatelessWidget (giá trị final, không thay đổi trong runtime). Đặc điểm nổi bật: trong Flutter, mọi thứ đều là widget — màn hình, thành phần giao diện, và cả thông tin layout.

Ngôn ngữ Dart: Trình bày đặc điểm lập trình hướng đối tượng, hỗ trợ mixin, generic, isolate, static type; biên dịch sang mã ARM/x86 cho mobile và JavaScript cho web. Dart được Ecma chấp thuận và được Google sử dụng để xây dựng ứng dụng cho iOS, Android, Fuchsia và Web.

Firebase Realtime và các thành phần: Mô tả chi tiết các dịch vụ Firebase được đề cập trong văn bản: Crashlytics, Cloud Firestore, Authentication, Cloud Functions, Cloud Storage, Hosting, Test Lab for Android, Performance Monitoring.

Chương III — Môi trường phát triển

Chương trình bày lý do chọn Android Studio (hệ điều hành Android chiếm hơn 80% thị phần di động) và mô tả các tính năng của IDE: hệ thống Gradle-based, công cụ lint, ProGuard, tích hợp Google Cloud Platform. Cấu trúc thư mục project được phân tích theo các thư mục java/, manifest/, res/, Gradle Scripts/.

Nội dung thực hành gồm các bước thiết lập Flutter trên Android Studio: cài đặt plugin Flutter qua File → Setting → Plugin, tải Flutter SDK, giải nén và cấu hình đường dẫn SDK, khởi động lại IDE, tạo project Flutter mới.

Chương IV — Chi tiết sản phẩm Open Day

Đây là chương trọng tâm, mô tả từng màn hình chức năng đã được phát triển:

4.1 — Gói phụ thuộc: Khai báo firebase_auth: ^4.0 và firebase_core trong pubspec.yaml.

4.1 — Màn hình đăng nhập: Giao diện chia hai phần — phần giới thiệu (hình ảnh, 2 text) và phần đăng nhập (ô email, ô mật khẩu, nút đăng nhập, link đăng ký). Xử lý ba trường hợp lỗi: không nhập dữ liệu, nhập sai cú pháp email, nhập sai email/mật khẩu. Logic API dùng FirebaseAuth.signInWithEmailAndPassword(), sau khi xác thực thành công điều hướng sang Homescreen() qua Navigator.pushReplacement().

4.2 — Màn hình đăng ký: Thu thập 5 trường: họ và tên, số điện thoại, email, mật khẩu, ngày tháng năm sinh. API dùng FirebaseAuth.createUserWithEmailAndPassword() tạo tài khoản, sau đó dùng Firestore lưu thông tin người dùng gồm full_name, email, phone_number, dob. Thông báo đăng ký thành công qua SnackBar màu xanh lá cây.

4.3 — Màn hình chính sinh viên: Giao diện chia hai phần — trang cá nhân (ảnh, tên, sự kiện tham dự, học phí) và phần chức năng (làm bài kiểm tra, phân công, thời khóa biểu). Màn hình học phí hiển thị: mã hóa đơn, học kỳ, hạn trả, học phần, ghi chú.

4.5 — Thông tin sinh viên: Giao diện chia hai màn hình — phần giới thiệu (avatar, tên, ngành, niên khóa) và phần thông tin chi tiết (niên khóa, chuyên ngành, mã lớp, mã số sinh viên, ngày nhập học, ngày sinh, email, tên cha, tên mẹ, số điện thoại). API dùng FirebaseAuth.currentUser lấy người dùng hiện tại, truy vấn Firestore theo email để lấy full_name, cập nhật giao diện qua setState().

4.7 — Cơ sở dữ liệu Firebase: Dữ liệu người dùng được lưu trong Firestore gồm các trường: ngày tháng năm sinh, email, họ và tên, số điện thoại. Dữ liệu được ghi khi sinh viên đăng ký tài khoản.


Thiết kế và triển khai

Kiến trúc hệ thống

Ứng dụng theo mô hình client–cloud: Flutter (client) giao tiếp với Firebase (backend-as-a-service). Không có server riêng — toàn bộ xác thực và lưu trữ dữ liệu thông qua dịch vụ Firebase của Google.

Công nghệ sử dụng

Thành phần Công nghệ
Ngôn ngữ lập trình Dart
Framework UI Flutter
IDE Android Studio
Xác thực người dùng Firebase Authentication
Cơ sở dữ liệu Cloud Firestore (noSQL)
Backend Firebase (BaaS)
Nền tảng triển khai Android, iOS

Tổng kết trạng thái triển khai các tính năng

Tính năng Giao diện (UI) API kết nối Firebase
Đăng nhập ✓ ✓
Đăng ký ✓ ✓
Màn hình chính sinh viên ✓ Chưa hoàn thành
Thông tin sinh viên ✓ ✓
Học phí ✓ Chưa hoàn thành

Kiểm thử

Kiểm thử được thực hiện thủ công trên thiết bị thực (điện thoại Android và iOS). Các trường hợp kiểm thử cho màn hình đăng nhập gồm: để trống trường nhập, nhập sai cú pháp email, nhập sai thông tin đăng nhập. Firebase Test Lab for Android được đề cập là thành phần có trong hệ sinh thái Firebase nhưng không có bằng chứng được áp dụng trong đề tài.


Kết quả và đóng góp

Kết quả đạt được:
Tác giả đã hoàn thành một phần ứng dụng Open Day với 5 màn hình chức năng. Theo bảng tổng kết demo trong văn bản, 3/5 tính năng hoàn thành cả giao diện lẫn API kết nối Firebase (đăng nhập, đăng ký, thông tin sinh viên); 2/5 tính năng mới hoàn thành giao diện, chưa kết nối API (màn hình chính sinh viên, học phí).

Giải pháp kỹ thuật đề xuất và thực hiện:

  • Sử dụng GlobalKey<FormState> để xác thực toàn bộ form trước khi gửi dữ liệu lên Firebase.
  • Dùng TextEditingController riêng biệt cho từng trường nhập liệu để kiểm soát và đọc dữ liệu người dùng.
  • Dùng Navigator.pushReplacement() thay vì push() để loại bỏ màn hình đăng nhập khỏi ngăn xếp sau khi xác thực thành công, tránh người dùng quay lại màn hình đăng nhập bằng nút Back.
  • Dữ liệu người dùng được lưu đồng thời vào Firebase Authentication (email, mật khẩu) và Cloud Firestore (các thông tin hồ sơ bổ sung).

Đóng góp:
Đây là bước đầu xây dựng module quản lý tài khoản sinh viên cho ứng dụng di động của Trường Đại học Thái Bình Dương trên nền tảng Flutter và Firebase, tạo cơ sở để mở rộng thêm các chức năng quản lý học tập trong các phiên bản tiếp theo.


Hạn chế và hướng nghiên cứu tiếp

Hạn chế được tác giả nêu trong văn bản:

  • Chưa hoàn tất toàn bộ chức năng của ứng dụng; một số màn hình (học phí, trang chủ sinh viên) mới có giao diện, chưa kết nối API.
  • Môi trường thử nghiệm còn hạn chế do không có đủ kinh phí để kiểm thử trên hệ thống thực.
  • Giao diện một số trang chưa được tối ưu về mặt thẩm mỹ và bố trí điều khiển.
  • Tối ưu hóa hệ thống chưa tốt; độ bảo mật còn hạn chế.

Hướng phát triển tiếp theo được đề xuất:

  • Cập nhật, sửa, xóa thông tin sinh viên.
  • Cập nhật giao diện phần đăng ký.
  • Phát triển API cho màn hình học phí và trang chủ sinh viên.
  • Hoàn thiện các chức năng trong phần trang chủ sinh viên (làm bài kiểm tra, phân công, thời khóa biểu).

Giá trị tham khảo

Đồ án phù hợp để tham khảo cho:

  • Sinh viên ngành Công nghệ Thông tin đang học lập trình di động, đặc biệt những người mới tiếp cận Flutter và Firebase lần đầu. Chương II (giới thiệu Flutter, Dart, Firebase) và Chương III (thiết lập môi trường Android Studio) cung cấp tổng quan lý thuyết dễ tiếp cận.
  • Người làm đề tài xây dựng ứng dụng di động với Firebase Authentication: phần mã nguồn minh họa ở Chương IV (logic đăng nhập, đăng ký, truy vấn Firestore) cho thấy cách tổ chức FormKey, TextEditingController và tích hợp các phương thức Firebase trong Flutter.
  • Sinh viên đang tìm hiểu kiến trúc widget Flutter: phần mô tả StatefulWidget vs StatelessWidget, mô hình MaterialApp → Scaffold → Widget trong Chương II là tài liệu giới thiệu căn bản.
  • Người muốn hiểu cấu trúc tích hợp Flutter vào Android Studio: Chương III hướng dẫn từng bước cài đặt plugin, cấu hình SDK và khởi tạo project.

Câu hỏi thường gặp

1. Ứng dụng Open Day sử dụng phương thức xác thực nào và dữ liệu người dùng được lưu trữ ở đâu?
Ứng dụng dùng Firebase Authentication qua phương thức email và mật khẩu (signInWithEmailAndPassword() cho đăng nhập, createUserWithEmailAndPassword() cho đăng ký). Thông tin hồ sơ bổ sung (họ tên, số điện thoại, ngày sinh) được lưu song song vào Cloud Firestore với các trường full_name, email, phone_number, dob.

2. Tính năng nào trong ứng dụng đã hoàn chỉnh cả giao diện lẫn kết nối API, và tính năng nào còn dang dở?
Theo bảng tổng kết demo trong Chương IV, ba tính năng hoàn chỉnh cả UI và API Firebase là: Đăng nhập, Đăng ký, Thông tin sinh viên. Hai tính năng mới hoàn thành giao diện, chưa kết nối API là: Màn hình chính sinh viên và Học phí.

3. Tại sao đồ án chọn Flutter thay vì React Native, và lợi thế kỹ thuật cụ thể là gì?
Tác giả lập luận Flutter chạy animation ở 60 khung hình/giây, không cần cầu nối (bridge) giữa JavaScript và native layer như React Native, do đó hiệu suất cao hơn. Ngoài ra Flutter hỗ trợ Hot Reload trong milliseconds, không cần ngôn ngữ tạo layout riêng (JSX, XML), và tích hợp sẵn với IntelliJ IDEA/Android Studio.

4. Màn hình thông tin sinh viên hiển thị những trường dữ liệu nào và lấy dữ liệu bằng cách nào?
Màn hình thông tin sinh viên chia hai phần: phần giới thiệu (avatar, tên, ngành, niên khóa) và phần chi tiết (niên khóa, chuyên ngành, mã lớp, mã số sinh viên, ngày nhập học, ngày sinh, email, tên cha, tên mẹ, số điện thoại). Dữ liệu được lấy bằng hàm getUserFullName(): xác định người dùng qua FirebaseAuth.currentUser, sau đó truy vấn Firestore theo điều kiện email == user.email để lấy tài liệu tương ứng và cập nhật giao diện qua setState().

5. Những khó khăn chính khi phát triển đề tài là gì và tác giả đã xử lý như thế nào?
Tác giả nêu năm khó khăn chính: thiếu nền tảng về Dart, thiếu kiến thức về widget Flutter, thiếu kinh nghiệm lập trình di động, tài liệu cộng đồng còn hạn chế (do Flutter là công nghệ mới tại thời điểm thực hiện), và chưa quen với mô hình quản lý trạng thái. Cách khắc phục bao gồm: tự học Dart qua tài liệu trực tuyến, đọc tài liệu chính thức Flutter, tham gia cộng đồng qua diễn đàn và nhóm Facebook/Slack, và thực hành xây dựng ứng dụng thực tế.


Kết luận

Đồ án tốt nghiệp của sinh viên Tô Hùng Tây trình bày quá trình xây dựng module tài khoản sinh viên cho ứng dụng di động Open Day của Trường Đại học Thái Bình Dương, sử dụng Flutter (Dart) kết hợp với Firebase làm backend. Sản phẩm đạt được mức độ hoàn thiện một phần: ba trong năm tính năng (đăng nhập, đăng ký, thông tin sinh viên) hoàn chỉnh cả giao diện và kết nối API; hai tính năng còn lại (trang chủ sinh viên, học phí) mới dừng ở mức giao diện. Đồ án có giá trị thực hành rõ ràng trong việc minh họa quy trình tích hợp Flutter với Firebase Authentication và Cloud Firestore, nhưng còn khoảng cách đáng kể so với một ứng dụng sẵn sàng triển khai thực tế về độ bảo mật, tối ưu hóa và tính đầy đủ của chức năng. Hướng phát triển tiếp theo cần tập trung vào hoàn thiện API cho các màn hình còn dang dở và mở rộng các tính năng học tập theo yêu cầu thực tế của nhà trường.