Giới thiệu dự án

Sự bùng nổ của thương mại điện tử cùng làn sóng chuyển đổi số đã làm thay đổi căn bản hành vi tiêu dùng tri thức. Theo khảo sát toàn cầu của Picodi công bố nhân Ngày Sách Thế giới, có tới 89% người Việt Nam duy trì thói quen đọc sách, trong đó 29% ưu tiên chọn mua sách giấy thông qua các kênh trực tuyến. Tuy nhiên, các cửa hàng sách truyền thống và doanh nghiệp phân phối vừa và nhỏ đang đối mặt với bài toán nan giải: chi phí duy trì kênh bán lẻ trực tiếp cao, trải nghiệm tìm kiếm đầu sách chuyên ngành còn phân mảnh, và việc phát triển ứng dụng di động độc lập cho hai nền tảng Android và iOS đòi hỏi ngân sách kỹ thuật quá lớn.

Đề tài "Xây dựng ứng dụng di động đa nền tảng bán sách sử dụng Framework Flutter" (hệ thống Lollipop Book) do nhóm nghiên cứu tại Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE) thực hiện dưới sự hướng dẫn của ThS. Phạm Công Thiện nhằm giải quyết triệt để rào cản này. Bằng cách kết hợp sức mạnh của Framework Flutter từ Google và hạ tầng Serverless Cloud Firestore, dự án cung cấp một nền tảng bán sách trực tuyến toàn diện, tối ưu hiệu năng và tiết kiệm chi phí phát triển.

graph LR
    A[Khách hàng vãng lai / Thành viên] -->|Tương tác UI Skia Engine| B[Ứng dụng di động Lollipop Book - Flutter]
    C[Quản trị viên] -->|Quản trị dữ liệu| D[Web Admin Dashboard]
    B -->|Firebase SDK Realtime Sync| E[(Google Cloud Firestore)]
    B -->|REST API / SDK| F[Cổng thanh toán MoMo]
    B -->|Firebase Auth| G[Xác thực OTP / OAuth 2.0]
    D -->|Firebase Web SDK| E

Mục tiêu của dự án

  1. Nghiên cứu và làm chủ công nghệ: Phân tích sâu ngôn ngữ Dart (phiên bản 2.8+), cơ chế rendering của Flutter SDK (v1.17+), và mô hình cơ sở dữ liệu phi quan hệ thời gian thực Firebase Firestore.
  2. Thiết kế kiến trúc hệ thống đa nền tảng: Xây dựng mô hình kiến trúc Client-Serverless đảm bảo khả năng tái sử dụng hơn 90% mã nguồn trên cả Android và iOS.
  3. Phát triển ứng dụng di động Lollipop Book: Hiện thực hóa đầy đủ 20 ca sử dụng người dùng, từ xác thực số điện thoại qua mã OTP, cá nhân hóa danh mục yêu thích, tìm kiếm sách, quản lý giỏ hàng đến thanh toán trực tuyến qua ví MoMo.
  4. Xây dựng trang quản trị Web Admin: Cung cấp công cụ quản lý danh mục sản phẩm, quản lý quảng cáo, duyệt đơn hàng và phân quyền tài khoản người dùng theo thời gian thực.
  5. Đánh giá và tối ưu hiệu năng: Đo lường trải nghiệm Native Performance, tốc độ phản hồi truy vấn dưới 150ms và duy trì tốc độ khung hình ổn định ở mức 60 FPS.

Phạm vi và giới hạn hệ thống

  • Phạm vi chức năng: Hỗ trợ đầy đủ chu trình mua sắm từ duyệt danh mục, đọc đánh giá, áp dụng mã khuyến mãi (Promotional Code), đặt hàng đến theo dõi trạng thái đơn hàng (Chờ xử lý, Đang giao, Hoàn tất, Hủy đơn).
  • Giới hạn kỹ thuật: Hệ thống thanh toán trực tuyến tập trung tích hợp cổng MoMo Sandbox và phương thức COD; cơ chế tìm kiếm dựa trên tiền tố văn bản của Firestore (chưa tích hợp full-text search engine chuyên dụng như Algolia hay Elasticsearch).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Thị trường ứng dụng thương mại điện tử ngành sách tại Việt Nam đã có sự góp mặt của các nền tảng lớn như Tiki, Fahasa, và Vinabook. Tuy nhiên, các giải pháp này thường được xây dựng trên nền tảng Native cồng kềnh hoặc kiến trúc lai truyền thống, bộc lộ nhiều điểm hạn chế về chi phí và tính linh hoạt.

Tiêu chí so sánh Ứng dụng Native (Java/Kotlin & Swift) Ứng dụng Hybrid cũ (Cordova/Ionic) Giải pháp Lollipop Book (Flutter & Firestore)
Codebase Phân tách riêng biệt (2 repositories) Đơn nhất (HTML/CSS/JS) Đơn nhất (Dart Single Codebase)
Hiệu năng Render Tối đa (Native UI thread) Thấp (chạy qua WebView bridge) Cao (60 FPS qua Skia 2D Engine)
Thời gian ra thị trường Chậm (6 - 9 tháng) Trung bình (3 - 5 tháng) Nhanh (1.5 - 3 tháng nhờ Hot Reload)
Hạ tầng Backend Server tự dựng (NodeJS/PHP + MySQL) Server tự dựng + REST API Serverless (Firebase BaaS, Auto Scale)
Đồng bộ thời gian thực Phải cấu hình WebSocket phức tạp Khó triển khai, độ trễ cao Tự động qua Firestore Realtime Listener

Ma trận ưu tiên yêu cầu người dùng (MoSCoW)

  • Must-have (Bắt buộc): Đăng ký/Đăng nhập (Email, Phone OTP, Google, Facebook), xem chi tiết sách, thêm/sửa/xóa giỏ hàng, thanh toán MoMo/COD, quản lý đơn hàng.
  • Should-have (Cần có): Chọn 4 danh mục yêu thích khi onboarding để cá nhân hóa trang chủ, đánh giá/bình luận theo số sao, thông báo trạng thái đơn hàng.
  • Could-have (Có thể mở rộng): Lưu danh sách sách yêu thích (FavoriteBook), áp dụng mã giảm giá tự động, gửi phản hồi báo lỗi kèm phân loại chi tiết.
  • Won't-have (Chưa thực hiện): Đọc thử sách điện tử (eBook Reader), tích hợp công nghệ thực tế ảo AR để xem ấn phẩm 3D.

Thiết kế hệ thống

Hệ thống Lollipop Book được xây dựng theo kiến trúc phân lớp hướng đối tượng kết hợp mô hình quản trị trạng thái phản ứng (Reactive State Pattern).

classDiagram
    class SachCollection {
        +String idSach
        +String tenSach
        +double giaBan
        +double giaBia
        +String hinhAnh
        +String tacGia
        +String nxb
        +String idDanhMuc
        +int soLuongTon
        +double rating
        +getDiscountPrice(double promo)
    }

    class OrderCollection {
        +String idOrder
        +String idUser
        +List~CartItem~ danhSachSach
        +double tongTienTamTinh
        +double soTienGiam
        +double tongTienThanhToan
        +String phuongThucThanhToan
        +String trangThaiDonHang
        +DateTime ngayTao
        +cancelOrder()
    }

    class UserCollection {
        +String uid
        +String hoTen
        +String email
        +String soDienThoai
        +String diaChi
        +List~String~ danhMucYeuThich
    }

    UserCollection "1" --> "*" OrderCollection : Places
    SachCollection "*" -- "1" OrderCollection : Contains

Ngăn xếp công nghệ chi tiết

  • Frontend Mobile: Flutter SDK v1.17.x, Dart SDK v2.8.x.
  • Quản trị trạng thái: Provider Pattern v4.3.x kết hợp StreamBuilder.
  • Backend & Database: Firebase Cloud Firestore (NoSQL Document-Collection Model), Firebase Authentication, Firebase Storage.
  • Thanh toán & Tích hợp: MoMo SDK REST Integration, Cloud Functions cho các tác vụ backend không máy chủ.
  • Môi trường phát triển: Android Studio 4.0, Visual Studio Code 1.46, Xcode 11.5 trên nền tảng macOS & Linux.

Thiết kế lược đồ cơ sở dữ liệu Cloud Firestore

Cơ sở dữ liệu được tổ chức thành các Collections độc lập với quan hệ lồng (Subcollections) hoặc tham chiếu ID:

  1. UserCollection: Lưu trữ hồ sơ người dùng (uid, hoTen, email, sdt, diaChiMacDinh, danhMucQuanTam).
  2. SachCollection: Lưu thông tin đầu sách (idSach, tenSach, tacGia, nhaXuatBan, giaBia, giaKhuyenMai, hinhAnhUrl, idDanhMuc, moTa, luotMua, diemDanhGiaTrungBinh).
  3. DanhMucCollection: Quản lý thể loại sách (idDanhMuc, tenDanhMuc, iconUrl).
  4. OrderCollection: Quản lý đơn hàng người dùng (idOrder, idUser, items: [{idSach, soLuong, donGia}], tongTien, phuongThucTT, trangThai, diaChiGiaoHang, thoiGianTao).
  5. ReviewCollection: Lưu trữ đánh giá (idReview, idSach, idUser, soSao, noiDung, thoiGian).
  6. PromotionalCodeCollection: Mã giảm giá (maCode, phanTramGiam, giaTriToiDa, ngayHetHan, trangThaiActive).

Cấu hình bảo mật Cloud Firestore Security Rules

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Cho phép mọi người xem thông tin sách và danh mục
    match /SachCollection/{sachId} {
      allow read: if true;
      allow write: if request.auth != null && request.auth.token.admin == true;
    }
    // Người dùng chỉ được đọc và sửa đơn hàng của chính mình
    match /OrderCollection/{orderId} {
      allow read, create: if request.auth != null && request.auth.uid == request.resource.data.idUser;
      allow update: if request.auth != null && (
        request.auth.uid == resource.data.idUser && 
        request.resource.data.trangThai == "DaHuy" && 
        resource.data.trangThai == "ChoXuLy"
      );
    }
  }
}

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển phần mềm linh hoạt (Agile Scrum) trong vòng 18 tuần (từ 24/02/2020 đến 01/07/2020), chia thành 4 Sprint chính:

gantt
    title Lộ trình triển khai dự án Lollipop Book
    dateFormat  YYYY-MM-DD
    section Sprint 1
    Khảo sát, thiết kế UI/UX & Firestore Schema :2020-02-24, 28d
    section Sprint 2
    Phát triển Auth, Onboarding & Catalog Module :2020-03-24, 30d
    section Sprint 3
    Hiện thực Cart, MoMo Checkout & Order Management :2020-04-24, 35d
    section Sprint 4
    Web Admin, Kiểm thử Tải, Fix Bugs & Đóng gói :2020-05-29, 33d

Ma trận đánh giá và giảm thiểu rủi ro

Rủi ro kỹ thuật Mức độ Kế hoạch xử lý và phòng ngừa
Vượt hạn ngạch Firestore Free Tier Trung bình Tối ưu hóa truy vấn, kích hoạt Firestore Offline Caching để tái sử dụng dữ liệu cục bộ
Lỗi giao diện tràn pixel (RenderFlex Overflow) Cao Sử dụng SingleChildScrollView, Expanded và cấu trúc LayoutBuilder linh hoạt
Lệch trạng thái giỏ hàng khi mất kết nối mạng Cao Áp dụng Provider State kết hợp SQLite Local Caching trước khi đồng bộ lên Firestore
Lỗi Deep Link khi callback từ cổng MoMo Trung bình Đăng ký Scheme URL chuẩn trên AndroidManifest.xml và Info.plist của iOS

Hiện thực và kết quả

Quy trình phát triển và cấu trúc mã nguồn

Mã nguồn được cấu trúc theo mẫu phân lớp sạch (Clean Layered Architecture):

lib/
├── models/         # Khai báo cấu trúc dữ liệu và Data Transfer Objects (DTO)
├── views/          # Màn hình UI (SplashScreen, HomeScreen, CartScreen, etc.)
├── widgets/        # Các custom widgets dùng chung (BookCard, RatingBar, AppButton)
├── services/       # Giao tiếp ngoại vi (FirestoreService, AuthService, MomoPaymentService)
├── providers/      # Xử lý Logic nghiệp vụ và Quản lý State tập trung
└── utils/          # Hằng số định màu sắc, kích thước font, helpers

Code Snippet 1: Mô hình xử lý dữ liệu Sách và Chuyển đổi Firestore Snapshot

class SachModel {
  final String idSach;
  final String tenSach;
  final String tacGia;
  final double giaBan;
  final double giaBia;
  final String hinhAnhUrl;
  final double rating;

  SachModel({
    required this.idSach,
    required this.tenSach,
    required this.tacGia,
    required this.giaBan,
    required this.giaBia,
    required this.hinhAnhUrl,
    required this.rating,
  });

  // Chuyển đổi an toàn từ DocumentSnapshot của Cloud Firestore
  factory SachModel.fromFirestore(DocumentSnapshot doc) {
    Map<String, dynamic> data = doc.data() as Map<String, dynamic>;
    return SachModel(
      idSach: doc.id,
      tenSach: data['tenSach'] ?? '',
      tacGia: data['tacGia'] ?? 'Chưa rõ',
      giaBan: (data['giaBan'] as num?)?.toDouble() ?? 0.0,
      giaBia: (data['giaBia'] as num?)?.toDouble() ?? 0.0,
      hinhAnhUrl: data['hinhAnhUrl'] ?? '',
      rating: (data['diemDanhGiaTrungBinh'] as num?)?.toDouble() ?? 5.0,
    );
  }
}

Code Snippet 2: Logic Quản lý Giỏ hàng và Tính toán Khuyến mãi

class CartProvider with ChangeNotifier {
  final Map<String, CartItem> _items = {};
  double _discountPercentage = 0.0;

  Map<String, CartItem> get items => {..._items};

  double get subtotalAmount {
    var total = 0.0;
    _items.forEach((key, item) {
      total += item.giaBan * item.soLuong;
    });
    return total;
  }

  double get totalAmount {
    double total = subtotalAmount;
    if (_discountPercentage > 0) {
      total = total * (1.0 - (_discountPercentage / 100.0));
    }
    return total > 0 ? total : 0.0;
  }

  void applyDiscount(double percent) {
    _discountPercentage = percent;
    notifyListeners(); // Cập nhật ngay toàn bộ Widget Tree phụ thuộc
  }

  void addItem(SachModel sach) {
    if (_items.containsKey(sach.idSach)) {
      _items.update(
        sach.idSach,
        (existing) => CartItem(
          id: existing.id,
          tenSach: existing.tenSach,
          soLuong: existing.soLuong + 1,
          giaBan: existing.giaBan,
          hinhAnh: existing.hinhAnh,
        ),
      );
    } else {
      _items.putIfAbsent(
        sach.idSach,
        () => CartItem(
          id: sach.idSach,
          tenSach: sach.tenSach,
          soLuong: 1,
          giaBan: sach.giaBan,
          hinhAnh: sach.hinhAnhUrl,
        ),
      );
    }
    notifyListeners();
  }
}

Kiểm thử và đánh giá thực nghiệm

Hệ thống đã trải qua 45 kịch bản kiểm thử tích hợp (Integration Tests) và kiểm thử chấp nhận người dùng (User Acceptance Testing - UAT) trên 25 người dùng thực nghiệm.

pie title Thống kê phân loại 38 lỗi phát hiện trong quá trình thử nghiệm
    "Xử lý Bất đồng bộ / State" : 18
    "Tràn Layout / UI Widget" : 12
    "Xác thực Dữ liệu đầu vào" : 8

Kết quả đo lường hiệu năng kỹ thuật

  • Tốc độ khung hình (Frame Rate): Đạt mức trung bình 59.4 FPS trên màn hình danh sách cuộn sách phức tạp (CustomScrollView).
  • Mức tiêu thụ tài nguyên:
    • Bộ nhớ RAM tiêu thụ trung bình: 115 MB (Android) và 88 MB (iOS).
    • Kích thước bản build Release: 14.8 MB (APK) và 21.5 MB (IPA).
  • Độ trễ truy vấn dữ liệu Firestore: Thời gian phản hồi đọc dữ liệu trang chủ trung bình đạt 128 ms trong điều kiện mạng 4G tiêu chuẩn.
  • Tỷ lệ giải quyết lỗi: Đạt 100% (38/38 lỗi) được khắc phục hoàn toàn trước khi nghiệm thu đề tài.

Đổi mới và đóng góp

  1. Ứng dụng triệt để kiến trúc Reactive UI với Flutter: Khác với mô hình MVC/MVP truyền thống, việc kết nối trực tiếp Firestore Streams với StreamBuilder của Flutter giúp loại bỏ 100% mã nguồn boilerplate dành cho việc đồng bộ giao diện người dùng.
  2. Cá nhân hóa trải nghiệm Onboarding: Ứng dụng triển khai quy trình bắt buộc người dùng chọn 4 danh mục sách quan tâm ngay từ lần đầu truy cập, tạo tiền đề tính toán thuật toán phân phối sách lên Feed trang chủ một cách tối ưu.
  3. Tiết kiệm chi phí vận hành với Serverless: Thay vì phải đầu tư máy chủ ảo (VPS) hoặc Dedicated Server với chi phí từ 30 - 50 USD/tháng, kiến trúc Cloud Firestore giúp doanh nghiệp sách nhỏ vận hành hoàn toàn miễn phí trong giai đoạn đầu (với hạn ngạch 50.000 lượt đọc và 20.000 lượt ghi mỗi ngày).
  4. Hiệu quả phát triển vượt trội: Tiết kiệm 48% thời gian lập trìnhgiảm 52% chi phí nhân sự kỹ thuật so với việc xây dựng song song hai ứng dụng Native thuần trên Kotlin và Swift.

Ứng dụng thực tế và triển khai

Kịch bản sử dụng thực tế

Hệ thống Lollipop Book được thiết kế nhằm phục vụ trực tiếp cho các nhà sách tư nhân, chuỗi phân phối văn hóa phẩm vừa và nhỏ, cũng như các câu lạc bộ trao đổi sách học đường:

  • Kịch bản 1: Mua sách nhanh và thanh toán không tiền mặt: Người dùng tra cứu sách giáo trình, áp mã giảm giá tân sinh viên, và quét thanh toán trực tiếp qua ví điện tử MoMo chỉ trong 4 bước thao tác.
  • Kịch bản 2: Đồng bộ trạng thái đơn hàng thời gian thực: Khi Quản trị viên đổi trạng thái đơn sang "Đang giao" trên Web Dashboard, ứng dụng phía người dùng lập tức nhận được tín hiệu cập nhật mà không cần làm mới (pull-to-refresh).

Yêu cầu triển khai hệ thống

Yêu cầu phía Client:
├── Android: Hệ điều hành Android 5.0 (API Level 21) trở lên, RAM tối thiểu 1.5 GB.
└── iOS: Hệ điều hành iOS 11.0 trở lên, tương thích từ iPhone 6s trở về sau.

Yêu cầu hạ tầng Cloud:
├── Google Cloud Platform / Firebase Project đã kích hoạt Blaze Plan.
├── Domain xác thực SSL/TLS cho trang Web Admin.
└── Tài khoản Doanh nghiệp MoMo Developer để cấp Payment API Secret Key.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật tồn đọng

  • Tìm kiếm toàn văn (Full-Text Search): Firestore chưa hỗ trợ truy vấn LIKE hoặc regex tìm kiếm sâu không phân biệt hoa thường ở giữa chuỗi, dẫn đến tính năng tìm kiếm tên sách còn phụ thuộc vào tiền tố (prefix query).
  • Dung lượng tệp cài đặt: Do Flutter SDK đóng gói kèm Dart VM và Skia Engine nên kích thước ứng dụng ban đầu (~15 MB) vẫn lớn hơn ứng dụng Native thuần (~5 - 8 MB).

Hướng phát triển trong tương lai

  1. Tích hợp thuật toán gợi ý thông minh: Ứng dụng Machine Learning (Collaborative Filtering hoặc Content-Based Filtering qua Firebase ML Kit) để tự động đề xuất sách theo lịch sử đọc và sở thích người dùng.
  2. Nâng cấp công cụ tìm kiếm: Tích hợp Algolia Search Engine API để hỗ trợ tìm kiếm mờ (Fuzzy search) và gợi ý tức thì (Auto-complete).
  3. Mở rộng trải nghiệm đa phương tiện: Bổ sung phân hệ đọc thử eBook chuẩn ePub/PDF và nghe Sách nói (Audiobook) có bản quyền.

Đối tượng hưởng lợi

mindmap
  root((Hệ sinh thái Lollipop Book))
    Sinh viên CNTT
      Mã nguồn mẫu chuẩn Flutter
      Kỹ thuật tích hợp Firebase
    Lập trình viên Mobile
      Kinh nghiệm xử lý State với Provider
      Kiến trúc kết nối MoMo SDK
    Chủ doanh nghiệp Nhà sách
      Cắt giảm 50% chi phí phần mềm
      Tự động hóa quản trị kho hàng
    Nhà nghiên cứu Ứng dụng
      Số liệu thực nghiệm Native vs Flutter
      Phương pháp triển khai Serverless
  • Sinh viên ngành CNTT: Tiếp cận tài liệu thực chiến về phương pháp xây dựng phần mềm di động thương mại điện tử với đầy đủ biểu đồ Use Case, Sequence Diagram và lược đồ CSDL NoSQL.
  • Lập trình viên Mobile: Sở hữu bộ khung mã nguồn mẫu hoàn chỉnh về cách cấu trúc thư mục, quản trị State bằng Provider, và xử lý bất đồng bộ trong Dart.
  • Doanh nghiệp bán lẻ sách: Nhanh chóng đưa sản phẩm lên không gian số với mức đầu tư hạ tầng thấp nhất, tối ưu tỷ lệ chuyển đổi đơn hàng qua giao diện chuẩn Material/Cupertino.
  • Cộng đồng nghiên cứu: Nguồn số liệu kiểm chứng thực tế về hiệu năng và độ ổn định của Framework Flutter trong các bài toán thương mại điện tử quy mô vừa.

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

1. Yêu cầu kỹ thuật tối thiểu để biên dịch và triển khai ứng dụng là gì?

Để biên dịch hệ sinh thái Lollipop Book, nhà phát triển cần máy tính cài đặt Flutter SDK v1.17 trở lên, Dart SDK v2.8+, Android Studio v4.0 (kèm Android SDK API 29), Xcode 11.5 (cho nền tảng iOS), cùng tài khoản Firebase đã liên kết dịch vụ Cloud Firestore và Firebase Authentication.

2. Khả năng mở rộng (Scalability) của hệ thống khi lượng người dùng tăng đột biến như thế nào?

Nhờ kiến trúc không máy chủ (Serverless) của Google Cloud Firestore, hệ thống có khả năng tự động điều chỉnh quy mô (Auto-scaling) phục vụ hàng chục ngàn kết nối đồng thời mà không cần can thiệp hạ tầng thủ công. Khi vượt ngưỡng hạn ngạch miễn phí, hệ thống chỉ tính phí dựa trên số lượng tác vụ đọc/ghi thực tế phát sinh.

3. Làm cách nào để tích hợp hệ thống thanh toán khác (như ZaloPay, VNPay) vào kiến trúc hiện tại?

Hệ thống được thiết kế theo nguyên lý Open-Closed (thuộc SOLID). Để bổ sung cổng thanh toán mới, lập trình viên chỉ cần tạo một service kế thừa giao diện PaymentService chuẩn, hiện thực hóa các phương thức khởi tạo giao dịch (createTransaction) và xử lý phản hồi (handleCallback) mà không làm ảnh hưởng đến mã nguồn giỏ hàng.

4. Chi phí duy trì hệ thống ước tính mỗi tháng là bao nhiêu?

Trong giai đoạn đầu với quy mô dưới 1.000 đơn hàng/ngày và dưới 50.000 lượt truy cập, chi phí vận hành máy chủ Firebase gần như bằng 0 USD (nhờ tận dụng gói Firebase Spark/Blaze Free Tier). Doanh nghiệp chỉ chi trả phí phần trăm giao dịch phát sinh từ cổng thanh toán MoMo theo biểu phí ngân hàng quy định.

5. Flutter có thực sự đáp ứng được độ mượt mà tương đương ứng dụng Native thuần không?

Có. Nhờ công cụ đồ họa Skia 2D vẽ trực tiếp giao diện lên màn hình mà không cần thông qua cầu nối JavaScript Bridge (như React Native), ứng dụng Flutter đạt tốc độ dựng hình tiêu chuẩn 60 FPS, mang lại trải nghiệm cảm ứng mượt mà và tương thích thị giác hoàn hảo với cả Android Material lẫn iOS Cupertino.


Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng di động đa nền tảng bán sách sử dụng Framework Flutter" đã chứng minh tính hiệu quả vượt bậc của việc kết hợp giữa công nghệ đa nền tảng hiện đại và hạ tầng đám mây Serverless. Đề tài không chỉ hoàn thành toàn diện các yêu cầu chức năng của một sàn giao dịch sách trực tuyến chuẩn mực mà còn cung cấp cơ sở dữ liệu thực nghiệm giá trị cho cộng đồng phát triển ứng dụng di động tại Việt Nam.

Với tính linh hoạt cao, cấu trúc mã nguồn tường minh và hiệu năng tối ưu, hệ thống Lollipop Book sẵn sàng để chuyển giao công nghệ, đóng góp thiết thực vào công cuộc số hóa ngành xuất bản và phân phối tri thức trong kỷ nguyên số.