Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Dự án Flutter mới tạo chỉ có một thư mục lib với file main.dart. Sau vài tháng, nếu mọi thứ đều dồn vào đó, bạn sẽ mất nhiều thời gian chỉ để tìm file. Bài viết gợi ý cách tổ chức thư mục giúp dự án gọn gàng khi lớn dần.
Chia theo loại (layer-first): gom file theo vai trò kỹ thuật như models, screens, widgets, services. Dễ hình dung lúc đầu, nhưng khi ứng dụng lớn, một tính năng nằm rải rác ở nhiều thư mục.
Chia theo tính năng (feature-first): mỗi tính năng như đăng nhập, giỏ hàng, hồ sơ có thư mục riêng chứa mọi thứ nó cần. Khi sửa một tính năng, bạn làm việc gần như trong một chỗ. Đây là cách được nhiều nhóm ưa chuộng cho dự án vừa và lớn.
lib/
main.dart
app.dart # MaterialApp, theme, router
core/
constants/ # hằng số dùng chung
network/ # cấu hình http/dio, xử lý lỗi
theme/ # màu, kiểu chữ
utils/ # hàm tiện ích
widgets/ # widget dùng chung nhiều nơi
features/
auth/
data/ # api, repository, model từ JSON
domain/ # thực thể, quy tắc nghiệp vụ
presentation/ # màn hình, widget, state
cart/
data/
domain/
presentation/
profile/
data/
domain/
presentation/
Bạn không cần ba tầng data, domain, presentation cho mọi tính năng. Với tính năng đơn giản, chỉ cần một thư mục với vài file. Hãy tăng độ phức tạp khi thật sự cần.
Chiều phụ thuộc nên đi một hướng: presentation biết domain, data cũng biết domain, còn domain không biết ai cả. Nhờ vậy bạn đổi nguồn dữ liệu hay đổi thư viện giao diện mà ít ảnh hưởng đến phần còn lại.
login_page.dart.LoginPage._page, _widget, _repository, _controller, _model.Bạn có thể tạo file xuất lại nhiều file trong một thư mục để import gọn:
// features/auth/auth.dart
export 'presentation/login_page.dart';
export 'domain/user.dart';
Dùng vừa phải, vì lạm dụng sẽ che giấu phụ thuộc thật và làm biên dịch chậm hơn.
Với dự án rất lớn hoặc nhiều ứng dụng dùng chung mã, bạn có thể tách phần dùng chung thành các gói cục bộ (local packages) trong cùng kho mã, ví dụ gói giao diện chung, gói mạng, gói từng tính năng. Cách này buộc ranh giới rõ ràng nhưng làm cấu hình phức tạp hơn, nên chỉ làm khi thật sự cần.
Một sai lầm hay gặp là dựng cấu trúc khổng lồ cho ứng dụng chỉ có ba màn hình. Hãy bắt đầu đơn giản, và tái cấu trúc khi thấy dấu hiệu: file quá dài, khó tìm, hai người sửa đè lên nhau, hay một thay đổi nhỏ phải đụng nhiều thư mục.
Không có cấu trúc đúng tuyệt đối. Quan trọng là nhất quán, phù hợp quy mô và cả nhóm hiểu. Chia theo tính năng, giữ phụ thuộc một chiều và đặt tên rõ ràng sẽ giúp dự án dễ sống lâu.
Để cụ thể hơn, hãy hình dung tính năng giỏ hàng. Thư mục presentation chứa CartPage và các widget con như CartItemTile. Domain chứa lớp CartItem và giao diện CartRepository. Data chứa CartRepositoryImpl cùng lớp gọi API hoặc cơ sở dữ liệu cục bộ. Khi cần đổi nguồn dữ liệu từ bộ nhớ máy sang máy chủ, bạn chỉ thay phần triển khai ở data mà không đụng đến giao diện. Mỗi người trong nhóm cũng có thể nhận một tính năng riêng mà ít xung đột mã.
Nếu muốn xem cách tổ chức một dự án Flutter hoàn chỉnh, bạn có thể tham khảo các khóa học tại codebem.com.
Nguyễn Đình Cường
0 comment