- vừa được xem lúc

Flutter MVVM Riverpod Starter: Tạo App Siêu Tốc với Architecture Chuẩn

0 0 1

Người đăng: Henry Techie

Theo Viblo Asia

Dạo gần đây mình dành thời gian build một số app như Habit TreeSpeakie (bạn có thể xem đầy đủ tại Areser), hoặc thỉnh thoảng làm một số dự án outsource cho khách hàng. Mỗi lần bắt đầu một dự án mới là mình phải mất cả ngày để set up architecture, routing, auth, state management... cho app. Vậy nên, xuất phát nhu cầu thực tế, mình đã nghĩ đến việc build một base project Flutter gọn nhẹ để có thể bắt đầu nhanh nhất có thể. Và đó chính là lý do mà Flutter MVVM Riverpod Starter ra đời.

Bạn có thể xem ngay tại link: https://github.com/namanh11611/flutter_mvvm_riverpod

🚀 Tại sao lại chọn starter này?

Mục tiêu của mình là tạo ra một template nhẹ, nhưng đủ sức mạnh cho indie hackersolo developer. Chính vì vậy mà mình đã không chọn Clean Architecture, nó quá cồng kềnh với đối tượng mà mình nhắm tới. Hãy thử nghĩ xem, với dự án mình làm một mình hoặc team nhỏ chỉ 2-3 người, 99.99% là team sẽ không cần đến Abtract Repository để cho multi implementation. Andrea - một Flutter developer nổi tiếng - cũng đã nhắc đến vấn đề này trong bài viết Flutter App Architecture: The Repository Pattern.

Chính vì vậy, mình đã chọn kiến trúc MVVM (Model - View - ViewModel), chỉ đơn giản là dùng ViewModel để tách biệt logic ra khỏi UI.

Mình cũng chọn Riverpod, một state management giúp quản lý state linh hoạt. Mình biết tỷ lệ các bạn dùng BloC sẽ đông hơn, mình không đánh giá cái nào tốt hơn cái nào, chỉ đơn giản là mình thấy Riverpod viết code ngắn gọn hơn BloC.

Tiếp theo là phần Backend, mình biết đa số solo developer sẽ tích hợp Firebase, nhưng nó có một vấn đề là ... ĐẮT (khi dự án của bạn bắt đầu scale). Vậy nên mình đã chọn Supabase, cũng tương tự như Firebase nhưng RẺ hơn. Mình đã tích hợp sẵn code setup và một số function authentication.

Nếu anh em muốn kiếm tiền từ app thì cũng sẽ không thể thiếu được RevenueCat, giúp quản lý in-app purchase và subscription.

Ngoài ra còn Dark/Light Theme, Localization, routing, local storage, analytics, crashlytics... tất cả đều đã sẵn sàng.

📚 Thư viện sử dụng

Mục đích Thư viện
State flutter_riverpod, riverpod_annotation
Auth & Backend supabase_flutter, google_sign_in, sign_in_with_apple
Navigation go_router
UI/UX google_fonts, flutter_svg, shimmer, lottie
Storage shared_preferences, sqflite
HTTP dio, connectivity_plus
Utils uuid, envied, easy_localization
Monetization purchases_flutter, in_app_purchase
Analytics firebase_analytics, firebase_crashlytics

🏗 Kiến trúc project

Về kiến trúc project, mình chọn Feature-first (layer folder bên trong feature folder). Với mỗi feature như authentication, onboarding... mình sẽ tạo 1 folder bên trong features. Sau đó bên trong folder đó, mình lại tạo các layer folder như model, repository, ui.

lib/
├── constants/ # Hằng số, config chung
├── environment/ # Biến môi trường
├── extensions/ # Extension/helper methods
├── features/ # Module chức năng theo folder
│ ├── authentication/
│ ├── model/
│ ├── repository/
│ ├── ui/
│ ├── onboarding/
│ ├── home/
│ ├── profile/
│ ├── premium/
├── routing/ # Cấu hình route với go_router
├── theme/ # Config giao diện
└── utils/ # Tiện ích chung

Bạn có thể thấy không có layer như domain hay data.

Thường khi dùng Clean Architecture, domain của anh em sẽ có model, abtract repository, use case, nhưng giờ đây với việc không cần đến abtract repositoryuse case, mình có thể tối giản nó chỉ còn model.

Còn với data, với những feature chỉ cần truy cập tới remote hoặc local data, mình sẽ gọi hàm trực tiếp trong repository. Còn những feature cần cả 2 loại data, mình sẽ cân nhắc tạo data source nếu cần thiết.

🎉 Lời kết

Phong trào vibe coding ngày càng lên cao, vậy nhưng mình vẫn muốn vide coding một cách có kiểm soát. Với base project này, mình có thể hướng dẫn AI code theo cách mà mình muốn. Nếu nó có đi chệch đường ray thì mình cũng nhanh chóng nắn chỉnh lại được.

Như đã nói từ đầu, project này dành cho anh em indie hackersolo developer muốn launch MVP nhanh, nó giúp bạn tập trung vào business logic thay vì mất cả ngày setup và viết code. Vậy nên có thể nó sẽ chưa phù hợp với team của bạn nếu như team đông người và cần một base project chuẩn Clean Architecture.

Nếu bạn thấy nó có ích, đừng ngần ngại tặng mình 1 star nhé!

Link GitHub: https://github.com/namanh11611/flutter_mvvm_riverpod

🔔 Blog: henrytechie.com

☕️ Facebook: Henry Techie

☁️ TikTok: @henrytechie

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 299

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

1 1 355

- vừa được xem lúc

Flutter Animation: Creating medium’s clap animation in flutte Part II

Trong phần 1 mình đã giới thiệu với các bạn cơ bản về Animation trong Flutter. Score Widget Size Animation.

0 0 69

- vừa được xem lúc

Flutter - GetX - Using GetConnect to handle API request (Part 4)

Giới thiệu. Xin chào các bạn, lại là mình với series về GetX và Flutter.

0 0 368

- vừa được xem lúc

StatefulWidget và StatelessWidget trong Flutter

I. Mở đầu. Khi các bạn build một ứng dụng với Flutter thì Widgets là thứ không thể thiếu đúng không ạ. Và 2 loại Widget không thể thiếu đó là StatefullWidget và StatelessWidget.

0 0 155

- vừa được xem lúc

Tìm hiểu về Riverpod - Provider nhưng không hắn :v

Trong Flutter có rất nhiều các quản lý state: Provider, Bloc, GetX, Redux,... khó mà nói cái nào tốt hơn cái nào. Tuy nhiên nếu bạn đã làm quen với Provider thì không ngại để tìm hiểu thêm về Riverpod. Một bản nâng cấp của Provider. Nếu bạn để ý thì cái tên "Riverpod" là các chữ cái của "Provider" đ

0 0 70