Buổi 03 — Lý thuyết: Bản đồ app với Expo Router

Mục tiêu buổi học

  • Phân biệt tab navigation và stack navigation
  • Hiểu quy tắc “mỗi file là một màn hình” của Expo Router
  • Đọc được cấu trúc thư mục app/ của TaskFlow
  • Biết cách mở màn hình chi tiết và nhận tham số id
  • Biết cách hiển thị danh sách dài hiệu quả và chọn thông tin cho dashboard

1. Navigation — bản đồ của app

Tab navigation giúp chuyển giữa các khu vực ngang cấp. Stack navigation mở một màn hình chi tiết rồi quay lại đúng vị trí trước đó.

2. Expo Router — mỗi file là một màn hình

Project TaskFlow tạo ở buổi 1 đã dùng Expo Router. Bạn không khai báo danh sách màn hình trong code. Thay vào đó, đường dẫn file trong thư mục app/ chính là đường dẫn màn hình.
Project tạo bằng template mặc định của Expo SDK 57 đặt thư mục này ở src/app/. Một số project khác đặt ở app/ ngay thư mục gốc. Cả hai đều hoạt động giống nhau, bên dưới dùng src/app/.
Cấu trúc điều hướng của TaskFlow:
Bốn quy tắc cần nhớ:

3. Tabs bên trong Stack

Stack gốc chứa nhóm (tabs) và màn hình chi tiết. Nhờ vậy, khi mở chi tiết, màn hình mới đè lên cả thanh tab và có nút quay lại.
src/app/_layout.tsx
Layout của nhóm tab khai báo tên, icon cho từng tab. Thuộc tính name phải khớp tên file:
src/app/(tabs)/_layout.tsx
Template SDK 57 dùng NativeTabs (import từ expo-router/unstable-native-tabs) — thanh tab dùng component gốc của hệ điều hành. Khóa học dùng Tabs vì API ổn định và dùng được bộ icon @expo/vector-icons sẵn có. Khi AI sửa layout tab, hãy kiểm tra nó dùng loại nào.

4. Chuyển màn hình và nhận tham số

Có hai cách mở màn hình chi tiết:
Màn hình chi tiết đọc id từ đường dẫn bằng useLocalSearchParams:
src/app/task/[id].tsx
Chỉ truyền id qua đường dẫn, không truyền cả object công việc. Màn hình chi tiết dùng id để tìm công việc trong dữ liệu. Nếu AI sinh code kiểu params: { task: JSON.stringify(task) }, hãy yêu cầu sửa lại.

5. Bốn tab của TaskFlow

6. Dashboard trả lời điều gì?

Trong vài giây, người dùng cần biết:
  • Hôm nay cần làm gì?
  • Việc nào quá hạn hoặc ưu tiên cao?
  • Tiến độ chung đang ở mức nào?
  • Ai đang phụ trách từng việc?

7. Danh sách cuộn thông minh

FlatList chỉ dựng các phần tử cần thiết trên màn hình. Bạn cung cấp nguồn dữ liệu và khuôn TaskCard; React Native xử lý phần lặp. Mỗi TaskCard khi bấm sẽ mở /task/[id] tương ứng.

Tóm tắt buổi học

  • Expo Router: đường dẫn file trong app/ là đường dẫn màn hình.
  • _layout.tsx quyết định kiểu điều hướng: Stack cho luồng đi sâu, Tabs cho khu vực chính.
  • Nhóm (tabs) gom file mà không đổi đường dẫn; [id] tạo route động.
  • Mở màn hình bằng Link hoặc router.push, đọc tham số bằng useLocalSearchParams.
  • Dashboard ưu tiên hành động; danh sách dùng FlatList và component tái sử dụng.