analyzer
이 패키지는 Dart 코드의 정적 분석을 수행하는 라이브러리를 제공합니다.
Denwee: 일일 퀴즈는 실제 프로젝트에 적합한 깔끔하고 확장 가능한 아키텍처를 보여주는 오픈소스 플러터 앱입니다 📱
이 패키지는 Dart 코드의 정적 분석을 수행하는 라이브러리를 제공합니다.
Firebase Crashlytics용 Flutter 플러그인입니다. 잡히지 않은 오류를 Firebase 콘솔로 보고합니다.
v5.9.3화면 및 글자 크기 조정을 위한 플러터 플러그인입니다. 다양한 모델에서 잘 보이도록 보장됩니다
v2.0.1내장된 효과 세트를 갖춘 사용자 정의 가능한 애니메이션 페이지 인디케이터입니다.
v4.5.2간편하고 사용자 정의가 가능한 통합 API를 통해 Flutter에 아름다운 애니메이션 효과 및 빌더를 추가하세요.
v5.2.0짧은 시간 안에 아름다운 사용자 정의 애니메이션을 만들 수 있는 강력한 패키지입니다.
v0.8.0슬리버로 스티키 헤더를 구현한 플러터. CustomScrollView에서 사용합니다.
Dart에서의 함수형 프로그래밍. 효율적인 불변 데이터 구조, 모나드, 렌즈 및 기타 FP 도구를 사용하여 Dart 코드를 정제하세요.
Flutter 내부 구매 및 구독을 쉽게 만듭니다. 이 플러그인은 iOS, macOS 및 Android를 지원합니다.
추가적인 노력 없이 이미 빌드된 위젯을 스켈레톤 로더로 변환합니다.
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 🫶