analyzer
Este pacote fornece uma biblioteca que realiza análise estática de código Dart.
Denwee: Trivias Diárias é um aplicativo Flutter de código aberto que demonstra uma arquitetura limpa e escalável para projetos do mundo real 📱
Este pacote fornece uma biblioteca que realiza análise estática de código Dart.
Plugin Flutter para o Firebase Crashlytics. Ele relata erros não tratados para o console do Firebase.
v5.9.3Um plugin do Flutter para adaptar tela e tamanho de fonte. Garantido para ficar bom em diferentes modelos
v2.0.1Indicador de página animado personalizável com um conjunto de efeitos embutidos.
v4.5.2Adicione efeitos animados bonitos e construtores no Flutter por meio de uma API fácil, personalizável e unificada.
v5.2.0Pacote poderoso para criar animações personalizadas bonitas em pouco tempo.
v0.8.0Implementação do Flutter de cabeçalhos colantes como uma lâmina. Use-o em um CustomScrollView.
Programação funcional em Dart. Purifique seu código Dart usando estruturas de dados imutáveis eficientes, mónadas, lentes e outras ferramentas de FP.
Compras e assinaturas in-app no Flutter tornam-se fáceis. O plugin suporta iOS, macOS e Android.
Converte widgets já construídos em carregadores de esqueleto sem esforço adicional.
Uma representação unificada de formulário em Dart que visa simplificar a representação e validação de formulários de forma genérica.
Plugin do Flutter para descobrir o estado da visibilidade do teclado em Android e iOS.
{"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.7Texto original em inglês. Visite o GitHub para a versão atual.
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 🫶