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 🫶