analyzer
此套件提供一個庫,可執行 Dart 程式碼的靜態分析。
Denwee:每日趣味知識是一個開源的Flutter應用,展示適用於現實專案中的乾淨、可擴展架構 📱
此套件提供一個庫,可執行 Dart 程式碼的靜態分析。
Firebase Crashlytics 的 Flutter 插件。它會將未捕獲的錯誤報告至 Firebase 控制台。
v5.9.3一個用於適配螢幕和字體大小的Flutter外掛程式。確保在不同型號上都能呈現良好效果
v2.0.1可自定義的動畫頁面指示器,帶有一組內建效果。
v4.5.2透過簡單、可自訂且統一的 API,在 Flutter 中新增美觀的動畫效果與建構器。
v5.2.0功能強大的套件,可快速建立美觀的自訂動畫。
v0.8.0Flutter 中的黏性標題實現為一個滑動條。在 CustomScrollView 中使用它。
Dart 中的函數式程式設計。使用高效能的不可變資料結構、單子、透鏡及其他 FP 工具來淨化您的 Dart 程式碼。
Flutter 內購與訂閱變得輕鬆。此外掛程式支援 iOS、macOS 與 Android。
將已建構的 widget 轉換為骨架載入器,無需額外努力。
一種統一的 Dart 表單表示形式,旨在以通用方式簡化表單表示和驗證。
用於在 Android 和 iOS 上發現軟鍵盤可見性狀態的 Flutter 插件。
{"sdk":"flutter"}^4.4.0^16.1.1^5.0.7^12.1.1^6.3.0^7.0.1^0.20.2^3.0.8^9.1.1^2.29.0^0.5.40^12.0.1^6.4.1^5.9.0^7.0.0^7.0.0^2.0.6+1^1.6.4^9.11.0^0.10.1^2.1.5^4.9.0^9.0.5^2.6.0^3.1.0^2.5.3^9.2.4^12.2.0^9.0.0^6.1.1^0.8.0^2.1.0^0.5.0+2^3.7.1^3.3.2^1.4.0^5.2.0^2.0.2^6.0.0^5.9.3^2.6.2^0.3.4^4.5.2^1.2.1^2.2.2^0.8.0^0.0.1+3^4.2.0^3.0.0^6.1.5^3.4.1^2.10.1^4.1.0^0.10.5^1.1.0^2.2.1^3.0.1^2.1.2^2.0.11^0.16.0{"path":"packages/top_snackbar/"}^1.2.0^0.28.0^6.3.2^12.0.1^4.1.0^0.3.2^4.0.1{"path":"packages/utils/"}{"path":"packages/markdown_widget/"}^2.9.1^6.11.1^2.10.3^3.2.3^8.4.1^6.0.0^2.29.0^0.14.4^2.4.7以下為英文專案原文快照,最新內容請造訪 GitHub。
Download on the App Store Get it on Google Play
Denwee is an open-source mobile application built with Flutter. It delivers personalized daily facts based on user-selected interests and supports push notifications, localization, and a modular, scalable architecture inspired by SOLID principles.
Click to watch full app onboarding (30s):
| Layer | Technologies | Description |
|---|---|---|
| Frontend (Open Source) | Flutter, Dart, Firebase Cloud Messaging, Localizations | Client app, responsible for UI, notifications, localization, and user interactions |
| Backend (Closed Source) | Supabase, PostgreSQL, Supabase Edge Functions, ChatGPT API (Batch), Cron/Scheduled Jobs | Handles authentication, facts generation, data storage, multi-device token management, and notification scheduling |
| Infrastructure | Supabase (Database, Auth, API) Firebase (Push Notifications, Analytics, Crashlytics) |
Manages user accounts, data, push notifications, analytics, and crash reporting |
| Package | Purpose |
|---|---|
| flutter_bloc | State management |
| get_it | Dependency injection |
| app_links | Deep links |
| drift | Local database |
| dio | Network requests |
| easy_localization | Multi-language support |
| animate_do | Animations |
This section describes the architectural structure of the application and its internal dependency model. The design follows principles inspired by Clean Architecture, with emphasis on separation of concerns, modularity, and long-term maintainability.
The project is organized using a feature-based structure with explicit separation between domain, data, and presentation layers. The following diagram illustrates the base structure of the project:
flowchart TB
subgraph Presentation[" "]
direction TB
page
bloc
widget
shared
end
subgraph Feature[" "]
direction TB
data --> model_m[model]
data --> repo_m[repo]
data --> source_m[source]
domain --> entity_d[entity]
domain --> repo_d[repo]
domain --> source_d[source]
domain --> use_case_d[use_case]
end
lib --> core
core --> feature
feature --> Feature
lib --> presentation
presentation --> Presentation
The
presentation/folder is kept outside of thecore/directory to enforce strict separation between application logic and UI components. Below is what each layer is responsible for using the Profile feature as an example for typical files ⬇️
| Folder | Responsibility | Typical Files |
|---|---|---|
entity/ |
Business models | profile.dartprofile_failure.dart |
use_case/ |
Business operations | get_profile_use_case.dart |
repo/ |
Repository contracts | profile_repo.dart |
source/ |
Data source contracts | profile_local_source.dartprofile_remote_source.dart |
The domain layer contains pure business logic and application rules for implementing feature behavior in the application. It defines core use cases and entities and remains independent of external frameworks and data sources.
| Folder | Responsibility | Typical Files |
|---|---|---|
model/ |
Data transfer objects (DTOs) | profile_dto.dartprofile_response_dto.dart |
repo/ |
Repository implementations | profile_repo_impl.dart |
source/ |
Local / Remote data source implementations | profile_local_source_impl.dartprofile_remote_source_impl.dart |
The data layer is used for retrieving, storing, and transforming external data for application features. It implements domain contracts and performs DTO-to-entity mapping.
pages/ contains all application screensbloc/ contains Cubits and Blocs for state managementwidget/ contains reusable UI componentsshared/ contains routing, theming, constants, utilities, etc...The presentation layer is separated from core feature modules as a deliberate design choice. This structure reflects a personal preference for improved screen discoverability and centralized UI infrastructure.
The application uses annotation-based dependency injection with injectable and get_it to connect layers and enable controlled execution flows.
Dependencies are registered automatically through code generation.
Example objects injection:
@LazySingleton()
class ProfileCubit extends Cubit<ProfileState> {
final GetProfileUseCase _getProfileUseCase;
ProfileCubit(this._getProfileUseCase) : super(ProfileState.initial());
}
@LazySingleton()
class GetProfileUseCase {
final ProfileRepo _profileRepo;
const GetProfileUseCase(this._profileRepo);
}
Example resolution hierarchy:
ProfilePage
→ ProfileCubit
→ GetProfileUseCase
→ ProfileRepository
→ ProfileRemoteSource / ProfileLocalSource
→ API
To run this application, you'll need Flutter of version 3.35.5 or higher:
# Get all packages
flutter pub get
# Generate localization files
flutter pub run easy_localization:generate -S "assets/translations" -O "lib/presentation/shared/localization"
# Generate localization keys
flutter pub run easy_localization:generate -S "assets/translations" -O "lib/presentation/shared/localization" -o "locale_keys.g.dart" -f keys
# Build runner
dart run build_runner build --delete-conflicting-outputs
# Run dev environment
flutter run --flavor dev -t lib/main_dev.dart
# Run prod environment
flutter run --flavor prod -t lib/main_prod.dart
Denwee projects are crafted by a solo enthusiastic developer across Mobile, Web, and Backend technologies. Your contributions, no matter how big or small, are always welcome! Here’s how you can help:
Explore the Denwee App landing page, built with Flutter Web. This simple landing page is also open-source 🔥 Check it out
Some design elements and animations were inspired by Reflectly App, adapted and implemented originally for Denwee. Definitely check out their awesome product!
If this project helped you, a quick review on the App Store or Google Play would really mean a lot! For any questions or support, please reach out to support@denwee.com 🫶