StuartApp/flutter-modular-architecture
57.7
Adequate · 21 September 2026
1.7k
lines of production code
Dart
primary language
4
measurements over time
What this system is
This system is a Flutter-based mobile application designed to help users discover and navigate bike-sharing services. It retrieves and sorts available services and their associated stations by proximity to the user's current location. The architecture is modular, separating use cases, features, and adapters, and employs the BLoC pattern for state management.
Features
Add bike services feature with service selection and location permission handling
Introduces a new bike services feature that allows users to view and select from a list of nearby bike services. The implementation includes a ServiceSelectorPage that displays services sorted by distance, showing the city name and service name for each option. The feature integrates with location services, requesting permission and displaying a warning if location access is denied. Users can reload the list if an error occurs, and the UI provides loading, success, and failure states with appropriate feedback.
_packages/features/bike\services/lib/src · high confidence
Add location use cases and adapters
Introduced a new location feature module containing use cases for requesting location permissions, retrieving the current and last known positions, and checking if location services are enabled. The change includes the core use-case interfaces and their implementations, along with dependency configurators for both real adapters (wrapping the geolocator package) and fake adapters for testing.
(repo-wide) · high confidence
Initial Flutter app structure with dependency injection and navigation setup
The application is initialized with a basic Flutter setup, including a main entry point that configures dependency injection using the GetIt package. The app defines a navigation structure that routes to a service selector, bike stations, and favorite stations pages, integrating with an intent launcher for deep linking or external navigation.
lib · high confidence
Initial Flutter project scaffolding for Android and iOS
The Android and iOS native project files have been added, establishing the base configuration for the Flutter application. This includes the Android manifest with location permissions, the iOS Info.plist with location usage descriptions, and the standard Xcode/Gradle build configurations required to run the app on both platforms.
android, ios · high confidence
Introduce bike services use cases and real-world API adapter
A new \bike\_services\ module has been added to the use cases layer, providing \GetAllServices\ and \GetAllServicesSortedByDistance\ use cases along with supporting models (\City\, \Service\) and a \SortedServicesResponse\. The module also includes a \ServiceRepository\ interface and its implementation that fetches data from the \api.citybik.es\ endpoint, mapping the external API's JSON response into the domain models. This change adds the capability to retrieve and sort bike-sharing services by distance from a user's location.
_packages/use\_cases/bike\services · high confidence
Introduce bike station data fetching and sorting capabilities
Added the \bike\_stations\ use-case module, which provides two new capabilities for users: retrieving a list of bike stations for a given service, and retrieving the same list sorted by distance from the user's current location. The implementation includes a \Station\ model, repository interfaces, and concrete adapters that fetch data from the \citybik.es\ API, mapping the raw JSON into domain models. The sorting use case leverages the user's current location to order stations by proximity.
_packages/use\_cases/bike\_stations, packages/use\_cases/bike\_stations/lib/src/use\_cases/impl, packages/use\_cases/bike\_stations/packages/real\adapters · high confidence
Introduce bike stations feature with service-specific station listing
The \bike\_stations\ feature module has been extracted, introducing a new \ServiceStationsPage\ that displays a list of bike stations for a specific service. The page accepts \serviceId\ and \serviceName\ as required parameters, using the service name in the page title. A dedicated \ServiceStationsBloc\ manages the loading, success, and failure states for fetching and displaying stations, while a \FavoriteStationsPage\ is also added to view favorite stations. The UI includes a \StationListItem\ widget that displays station details such as bike counts and distance.
_packages/features/bike\stations · high confidence
Introduce intent launcher with navigation intent support
Added a new intent launcher system that enables navigation through a decoupled intent-based approach. The change introduces a \NavigationIntent\ abstraction and an \IntentLauncher\ implementation that routes navigation requests to registered handlers. Developers can now use a \BuildContextExtension\ to trigger navigation via \context.go(intent)\ and wrap widgets with \IntentLauncher\ to provide the launcher to the widget tree. This replaces direct navigation calls with intent-based dispatch, allowing for more flexible and testable navigation logic.
_packages/shared/features/intent\launcher · high confidence
Architecture
Introduce modular architecture with BLoC pattern and dependency injection
The project now enforces a modular architecture separating Use Cases and Features, with the \bike\_services\ feature package explicitly adding BLoC for state management. A Makefile replaces shell scripts to standardise build, clean, and dependency resolution commands. Configuration files (\.gitignore\, \analysis\_options.yaml\) and documentation (README with architecture diagrams and dependency injection examples) are added to support this structure.
(repo-wide) · high confidence
Behavioural changes
Bike services feature extraction and navigation updates
The bike services feature has been extracted into its own module, introducing a new \bike\_services\_features.dart\ file that exports the \ServiceSelectorPage\. Additionally, a new \BikeServiceStations\ navigation intent has been added to \navigation\_intents.dart\, which now requires \serviceId\ and \serviceName\ as parameters, and the \ServiceStationsPage\ title has been updated to display the service name.
_packages/features/bike\services/lib · medium confidence
Introduces core dependency injection and failure handling abstractions
The shared core package now provides a structured approach to dependency injection and error handling. A new \inject\ helper and \DependencyConfigurator\ interface enable consistent service location via GetIt, while a \Failure\ base class and specific \NetworkFailure\ and \PermissionFailure\ types standardize error representation across the application.
packages/shared · high confidence
Sort bike services by distance to user's location
The \GetAllServicesSortedByDistance\ use case now retrieves the user's last known location and sorts the list of bike services based on their distance from that location. This ensures that services closer to the user appear first in the results, providing a more relevant experience when browsing available bike services.
_packages/use\_cases/bike\_services/lib/src/use\cases/impl · high confidence
Test coverage
Added smoke test for the app's welcome message
Added a new widget test in test/widget\_test.dart that verifies the 'Welcome to Bici!' text is rendered correctly in the application's main widget.
test · high confidence
Dependencies
Initial Flutter project setup with modular architecture dependencies
This change establishes the foundational build configuration and dependency management for a Flutter application structured with a modular architecture. It introduces Gradle build scripts for Android, a CocoaPods configuration for iOS, and multiple \pubspec.yaml\ files that define the project's Dart package dependencies. These include shared core utilities, feature modules for bike services and bike stations, use cases, and location services, each with their own lockfiles and transitive dependencies such as \flutter\_bloc\, \geolocator\, and \freezed\.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 57 → 58 (+0.3)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 100 (-0.4)
- Architecture 100 → 97 (-3.4)
- Maturity 70 → 73 (+3.1)
- Readiness 24 → 24 (+0.0)
- Security 100 → 100 (+0.0)
- Domain Modelling 100 → 100 (+0.0)
Resolved (9)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- No exposed public API
- Test reliability not included
- The iOS asset README is thin and does not explain how to customize the launch screen beyond replacing image files in this directory. (ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md)
- complexity unreadable for .dart, .kt, .swift — churn × complexity hotspots could not be measured
- early-stage repository — too little history to judge knowledge freshness
- git history depth insufficient
- single-maintainer — knowledge-concentration (bus factor) risk
New (7)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (11 lines × 2) (packages/features/bike_services/lib/src/pages/service_selector_page.dart)
- Duplicated block (11 lines × 2) (packages/use_cases/bike_services/packages/real_adapters/lib/dependency_configurator.dart)
- No ADRs found
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
StuartApp/flutter-modular-architecture was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 096ebec8d7c8925a925df019758d01ee95a7c856 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-fa71c66cabd8.