Skip to content

Conversation

@nikunj-p-7span
Copy link
Contributor

@nikunj-p-7span nikunj-p-7span commented Jan 9, 2026

Description

  • Update the pub packages in the project.
  • Change the build gradle version to run the project in latest version

Type of Change

  • ✨ New feature (non-breaking change which adds functionality)
  • 🛠️ Bug fix (non-breaking change which fixes an issue)
  • ❌ Breaking change (fix or feature that would cause existing functionality to change)
  • 🧹 Code refactor
  • ✅ Build configuration change
  • 📝 Documentation
  • 🗑️ Chore

Summary by CodeRabbit

  • Chores

    • Updated Android SDK, Gradle wrapper and build tooling; made min SDK configurable.
    • Large dependency bumps across Flutter/Dart packages, added workspace layout and Firebase entries, and updated project manifest and tooling.
    • Cleaned, added and consolidated IDE run configurations and project scripts; added project scaffolding files.
  • Refactor

    • Converted multiple dispose/teardown and lifecycle callbacks to asynchronous patterns for more reliable shutdown and awaited flows.

✏️ Tip: You can customize this high-level summary in your review settings.

- Updated `compileSdk` to 36 and `minSdk` to use `flutter.minSdkVersion` in `app/build.gradle.kts`.
- Upgraded Android Gradle Plugin (AGP) version to 8.9.1 in `settings.gradle.kts`.
- Updated Gradle wrapper distribution to version 8.11.1.
- Updated `graphql` from `^5.2.0-beta.7` to `^5.2.3`.
- Updated `fpdart` from `^1.1.1` to `^1.2.0`.
- Updated `dio` from `^5.8.0+1` to `^5.9.0`.
- Updated `hive_ce` and `hive_ce_flutter` to versions `^2.16.0` and `^2.3.3` respectively.
- Updated `flutter_lints` to `^6.0.0` and `hive_ce_generator` to `^1.11.0` in dev_dependencies.
- Upgraded `onesignal_flutter` to version 5.3.5.
- Upgraded `flutter_lints` to version 6.0.0.
- Upgraded `very_good_analysis` to version 10.0.0.
- Updated `in_app_purchase` from `^3.2.1` to `^3.2.3`.
- Updated `equatable` from `^2.0.7` to `^2.0.8`.
- Updated `flutter_lints` from `^5.0.0` to `^6.0.0` in `dev_dependencies`.
- Upgraded `slang` and `slang_flutter` to versions `^4.11.1` and `^4.11.0` respectively.
- Upgraded `slang_build_runner` to `^4.11.0`.
- Upgraded `flutter_lints` to `^6.0.0`.
- Upgraded `melos` to `^7.3.0`.
- Upgraded `build_runner` to `^2.10.4`.
- Updated several dependencies to their latest versions: `equatable`, `flutter_blurhash`, `flutter_spinkit`, `skeletonizer`, `timeago`, `url_launcher`, `flutter_svg`, and `pinput`.
- Updated dev_dependencies: `flutter_lints`, `build_runner`, `flutter_gen`, and `flutter_gen_runner`.
- Updated multiple dependencies including `timeago`, `envied`, `hive_ce`, `flutter_bloc`, `get_it`, `auto_route`, and `image_picker`.
- Updated dev dependencies including `flutter_lints`, `build_runner`, `flutter_gen`, and `very_good_analysis`.
@coderabbitai
Copy link

coderabbitai bot commented Jan 9, 2026

📝 Walkthrough

Walkthrough

Bumps Android/Gradle toolchain and many Dart/Flutter dependency versions, adds workspace/melos config, converts several synchronous dispose/listener/helpers/navigation methods to async Future<void>, updates widgetbook knob APIs to dropdowns, and applies minor typing and lint/formatting edits.

Changes

Cohort / File(s) Summary
Android Build Configuration
apps/app_core/android/app/build.gradle.kts, apps/app_core/android/gradle/wrapper/gradle-wrapper.properties, apps/app_core/android/settings.gradle.kts
compileSdk 35 → 36; minSdk now flutter.minSdkVersion; Gradle wrapper 8.10.2 → 8.11.1; AGP plugin 8.7.0 → 8.9.1.
Root Workspace & Tooling
pubspec.yaml, melos.yaml, .idea/runConfigurations/*
Added workspace and melos scripts to root pubspec, removed melos.yaml, adjusted IDE run configs (add/remove EXECUTE_IN_TERMINAL).
Dependency Version Bumps
apps/app_core/pubspec.yaml, packages/*/pubspec.yaml (e.g., packages/api_client, packages/app_ui, packages/widgetbook, etc.)
Many package and dev_dependency upgrades (hive_ce, dio, graphql, get_it, auto_route, build_runner, flutter_gen, flutter_lints, widgetbook, etc.) and added resolution: workspace entries.
Notification Service API & Impl
packages/app_notification_service/lib/src/notification_interface.dart, packages/app_notification_service/lib/src/onesignal_service.dart, packages/app_notification_service/pubspec.yaml
dispose() signature changed from voidFuture<void> in interface and implementation; implementation now awaits stream close; onesignal and lint/dev deps bumped.
Connectivity / Network / Pagination Disposes
apps/app_core/lib/core/data/services/connectivity_service.dart, apps/app_core/lib/core/data/services/network_helper.service.dart, apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
Multiple dispose/listener methods converted to async Future<void> and now await controller/stream cancel/close or awaited internal calls.
Permission & Helper Callbacks
apps/app_core/lib/app/helpers/permission/permission_helper.dart, apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
redirectToSettings()Future<void> (awaits openAppSettings()); force_update uses unawaited(...) for update checks and minor conditional tweak.
Sign-in / Navigation Awaiting
apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart
Navigation callbacks and Google sign-in converted to async Future<void> and now await route pushes and sign-in calls.
Widgetbook Knob API Changes
packages/widgetbook/lib/widgets/** (multiple files)
Replaced numerous knobs.list<...> usages with knobs.object.dropdown<...> across widgetbook components (changes knob UI type and local variable types).
Minor Typing & Lint Cleanups
apps/app_core/lib/app/helpers/injection.dart, various apps/... and packages/... files
Added explicit type annotations, removed file-level lint ignores, small condition simplifications, formatting edits.
Mason Scripts
scripts/mason.yaml, scripts/mason-lock.json
Added mason configuration and lock file (bricks/feature).

Sequence Diagram(s)

sequenceDiagram
  actor FlutterApp as Flutter App
  participant NotificationInterface as NotificationServiceInterface
  participant OneSignal as OneSignalService
  participant Stream as notificationObserverStream

  FlutterApp->>NotificationInterface: call dispose() (awaited)
  NotificationInterface->>OneSignal: dispose()
  OneSignal->>Stream: close()
  Stream-->>OneSignal: closed
  OneSignal-->>NotificationInterface: Future completes
  NotificationInterface-->>FlutterApp: Future completes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels

enhancement

Suggested reviewers

  • cavin-7span

Poem

🐰 Hops of versions, builds that climb,
Streams tuck in softly, one await at a time,
Melos hums scripts, knobs now dropdown fine,
Typings tidy, configs align,
I nibble a carrot and dance on the CI line.

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Update packages' is vague and generic, using a non-descriptive term that does not clearly convey the scope or significance of the changeset. Consider a more specific title such as 'Update dependencies and Android build configuration' or 'Bump package versions and upgrade Gradle/Android tools' to better reflect the main changes.
✅ Passed checks (2 passed)
Check name Status Explanation
Description check ✅ Passed The pull request description includes the required sections (Description and Type of Change) with sufficient detail about the updates to packages and build configuration, and correctly identifies the change as a code refactor.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Fix all issues with AI agents
In @apps/app_core/android/app/build.gradle.kts:
- Around line 10-11: The ndkVersion setting in the Android build file uses a
beta/RC string ("29.0.13113456 rc1"); update the ndkVersion to a stable NDK
release to avoid instability in production (for example switch to a known stable
NDK like r28 or another released version), by changing the ndkVersion value in
the same block that contains compileSdk and ndkVersion so the build uses a
final/stable NDK instead of the RC/beta string.

In @apps/app_core/pubspec.yaml:
- Line 39: The pubspec lists envied at ^1.3.2 while envied_generator remains at
^1.1.1, causing a version mismatch that can break code generation; update
envied_generator to the matching ^1.3.2 (or a compatible ^1.3.x) wherever it
appears (including the other occurrence mentioned) so both envied and
envied_generator are kept in sync, then run pub get and regenerate sources.

In @packages/app_notification_service/lib/src/onesignal_service.dart:
- Around line 76-78: The interface method signature for
NotificationServiceInterface.dispose() must be changed to return Future<void> to
match the implementation in OnesignalService.dispose() (which is async), and
update all implementations to match; then update the call site
getIt<NotificationServiceInterface>().dispose() in
apps/app_core/lib/app/app.dart to handle the async result (either await the call
by making the caller async or call it with an explicit fire-and-forget wrapper
such as unawaited()/Future.microtask) so callers no longer assume a synchronous
void return.

In @packages/app_translations/pubspec.yaml:
- Around line 15-25: The package pubspec currently lists "melos: ^7.3.0" in
dev_dependencies which conflicts with the repo root (still on melos ^6.3.2) and
requires a workspace migration; either remove the "melos: ^7.3.0" line from this
package's dev_dependencies so melos is only managed at the root, or change it to
"melos: ^6.3.2" to match the root; if you intend to upgrade to melos 7.x,
coordinate a repo-wide migration (add workspace: in root pubspec, add
resolution: workspace to packages, and move melos.yaml into root under a
top-level melos: key) instead of changing this package alone.
🧹 Nitpick comments (2)
packages/app_notification_service/lib/src/onesignal_service.dart (1)

85-88: Consider using a broadcast stream or documenting single-listener constraint.

StreamController<NotificationObserverEvent> without .broadcast() only allows a single listener. If multiple parts of the app need to observe notifications, this will throw. If single-listener is intentional, consider adding a doc comment to clarify this constraint.

apps/app_core/pubspec.yaml (1)

84-84: Apple Sign-In implementation is compatible with 7.x, but consider improving error handling.

The upgrade to sign_in_with_apple 7.x is safe. The code uses SignInWithApple.getAppleIDCredential() directly (not SignInWithAppleButton), so the onPressed nullability change is not applicable. Error handling in sign_in_screen.dart (line 304) checks for AuthorizationErrorCode.canceled explicitly with a fallback else clause. While new AuthorizationErrorCode enum cases added in 7.x will be caught by the else clause and show a generic error message, you may want to audit the error code handling to explicitly address new cases for better user feedback.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b534a1f and 945f483.

📒 Files selected for processing (10)
  • apps/app_core/android/app/build.gradle.kts
  • apps/app_core/android/gradle/wrapper/gradle-wrapper.properties
  • apps/app_core/android/settings.gradle.kts
  • apps/app_core/pubspec.yaml
  • packages/api_client/pubspec.yaml
  • packages/app_notification_service/lib/src/onesignal_service.dart
  • packages/app_notification_service/pubspec.yaml
  • packages/app_subscription/pubspec.yaml
  • packages/app_translations/pubspec.yaml
  • packages/app_ui/pubspec.yaml
🧰 Additional context used
📓 Path-based instructions (1)
**/*.dart

📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)

**/*.dart: Use generated Assets class from flutter_gen for asset access instead of raw string paths like Image.asset("assets/...")
For PNG/JPG images in assets, use the .image() method from generated Assets class (e.g., Assets.images.demo.image())
For SVG assets in assets, use the .svg() method from generated Assets class (e.g., Assets.icons.home.svg())
Use .path property from generated Assets class when raw asset path strings are needed (e.g., Assets.images.demo.path)
Use .provider() method from generated Assets class when ImageProvider is needed for widgets like CircleAvatar or precacheImage

**/*.dart: Use context.t for accessing translations instead of hardcoded strings in Flutter widgets
Use VSpace and HSpace components for spacing instead of raw SizedBox widgets
Use AppButton component instead of raw Material buttons like ElevatedButton or TextButton
Use predefined AppText components (AppText.small(), AppText.medium(), AppText.large()) for text rendering
Use AppBorderRadius constants (small, medium, large) instead of raw border radius values
Use Insets constants for padding and margins instead of raw EdgeInsets values
Use AppLoadingIndicator component for showing loading states
Use AppButton with isExpanded: true for full-width buttons and isEnabled property for controlling button state
Use AppButton variants (secondary, outline, text, destructive) for different button styles instead of creating custom button implementations
Use AppCard component for card-based layouts instead of raw Card or Container widgets
Use AppTextField component for text input fields instead of raw Material TextField widgets

**/*.dart: Use context.colorScheme to access colors instead of hardcoded color values, following Material Design conventions
Use AppText widget instead of Text widget to utilize consistent typography
Use context.textTheme to access text styles instead of defining custom styles

...

Files:

  • packages/app_notification_service/lib/src/onesignal_service.dart
🧠 Learnings (4)
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization

Applied to files:

  • packages/app_notification_service/lib/src/onesignal_service.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*.dart : Use `Future<void>` as the return type of asynchronous members that do not produce values

Applied to files:

  • packages/app_notification_service/lib/src/onesignal_service.dart
📚 Learning: 2026-01-08T09:00:25.192Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/assets-rules.mdc:0-0
Timestamp: 2026-01-08T09:00:25.192Z
Learning: Applies to **/*.dart : Use generated `Assets` class from `flutter_gen` for asset access instead of raw string paths like `Image.asset("assets/...")`

Applied to files:

  • apps/app_core/pubspec.yaml
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_event.dart : Use Equatable for event class comparison in Flutter BLoC

Applied to files:

  • packages/app_subscription/pubspec.yaml
🔇 Additional comments (11)
apps/app_core/android/gradle/wrapper/gradle-wrapper.properties (1)

5-5: Gradle wrapper bump looks correct; verify AGP/Gradle compatibility in CI. (services.gradle.org)

This aligns with the AGP 8.9.x → Gradle 8.11.1 minimum requirement. (developer.android.com)

packages/app_subscription/pubspec.yaml (1)

14-24: Dependency bumps are fine; confirm platform requirements + new lints don’t break the build. (pub.dev)

  • in_app_purchase: ^3.2.3: please re-run the purchase flow on Android + iOS and confirm your min SDKs still satisfy the plugin requirements. (pub.dev)
  • flutter_lints: ^6.0.0: expect new analyzer findings; run flutter analyze and address/waive as intended. (pub.dev)
apps/app_core/android/settings.gradle.kts (1)

19-24: AGP bump to 8.9.1 is consistent with Gradle 8.11.1; verify JDK/Kotlin compatibility in CI. (developer.android.com)

At minimum, confirm the build uses a compatible Gradle (you bumped wrapper to 8.11.1) and that your CI JDK aligns with the AGP 8.x requirements. (developer.android.com)

packages/api_client/pubspec.yaml (1)

10-29: Version bumps look OK; please verify against upstream changelogs (notably Dio/Hive/GraphQL). (pub.dev)

Concrete asks:

  • Run codegen (build_runner) and a full analyzer run after flutter_lints bump. (pub.dev)
  • Smoke-test networking flows that exercise cancelation/interceptors after upgrading to Dio 5.9.0. (pub.dev)
packages/app_ui/pubspec.yaml (2)

27-35: LGTM on dev dependency updates.

The updates to flutter_lints, build_runner, flutter_gen, and flutter_gen_runner are appropriate version bumps that keep the tooling current.


12-22: The pinput 6.0 upgrade is backward compatible with no breaking changes affecting the codebase. The changelog confirms that changes are additive (new optional parameters like hintLocales, showErrorWhenFocused, and onTapUpOutside), and the existing Pinput widget usage in packages/app_ui/lib/src/widgets/molecules/app_otp_input.dart (using length and separatorBuilder parameters) will continue to work without modification.

Likely an incorrect or invalid review comment.

packages/app_notification_service/pubspec.yaml (1)

13-19: LGTM on dependency updates.

The onesignal_flutter patch update and linting tool upgrades are reasonable. Note that very_good_analysis jumps from 7.x to 10.x, which may introduce new lint rules—ensure the codebase passes analysis after this update.

apps/app_core/android/app/build.gradle.kts (1)

24-30: Good practice using flutter.minSdkVersion.

Using flutter.minSdkVersion instead of a hardcoded value ensures consistency with Flutter's requirements and simplifies future updates.

apps/app_core/pubspec.yaml (3)

36-90: LGTM on minor and patch version updates.

The updates to timeago, equatable, logger, flutter_bloc, fpdart, image_picker, permission_handler, flutter_svg, top_snackbar_flutter, and url_launcher are appropriate incremental updates.


55-55: get_it 9.x upgrade is compatible with the codebase.

The breaking changes in get_it 9.0 (LIFO disposal enforcement and strictDisposalOrder parameter removal) do not affect this codebase. The codebase uses only basic registerSingleton and registerLazySingleton patterns with instance names in bootstrap.dart, and simple getIt.get<T>() retrieval calls. No scope management, reset operations, or disposal ordering logic is used, so the upgrade to ^9.2.0 is safe.


68-68: Address breaking changes when integrating image_cropper 11.0.0.

image_cropper 11.0.0 has documented breaking changes from version 9.x:

  • Flutter SDK: Minimum constraint raised to 3.28 (your project satisfies this with >=3.7.2) ✓
  • Android: compileSdkVersion raised to 36; statusBarColor setting is deprecated—use statusBarLight and navBarLight instead
  • iOS: Minimum deployment target raised to iOS 12
  • API: Prior versions included File → CroppedFile migration (2.0.0) and UI settings refactoring (3.0.0)

When integrating image cropping functionality, update Android settings accordingly and review the changelog for any API usage patterns.

@pratik-7span pratik-7span self-assigned this Jan 9, 2026
…s `dispose()` method to be asynchronous (`Future<void>`).

- Updated `melos` to version `^7.3.0` and `flutter_lints` to version `^6.0.0` in `pubspec.yaml`.
- Properly awaited the notification service disposal in `apps/app_core/lib/app/app.dart`.
… disposal

- Properly awaited the `getIt<NotificationServiceInterface>().dispose()` call within the `App` class `dispose` method.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In @apps/app_core/lib/app/app.dart:
- Line 127: The dispose call on NotificationServiceInterface is async but is not
awaited; update the caller (the method containing
getIt<NotificationServiceInterface>().dispose()) to await
getIt<NotificationServiceInterface>().dispose() and, if necessary, mark the
enclosing method as async so the await is allowed; ensure any return types or
overrides (e.g., dispose/close methods in the widget/state) are updated to
return Future<void> if required so the async cleanup completes before exit.
- Around line 125-126: In the dispose override, await the async disposal of the
notification service: call await
getIt<NotificationServiceInterface>().dispose(); while leaving
NetWorkInfoService.instance.dispose() and _connectivityService.dispose() as
non-async calls, then call super.dispose(); so the method signature remains
Future<void> dispose() async and the NotificationService cleanup completes
before returning.

In @pubspec.yaml:
- Around line 19-20: Upgrade steps: remove melos.yaml and migrate melos config
into the root pubspec.yaml under a new "workspace" key, add "resolution:
workspace" to each package's pubspec, ensure Dart SDK constraint is bumped to
≥3.6 and update CI/automation to use pub workspaces; then bump flutter_lints to
^6.0.0, update SDK constraints to meet Flutter 3.32 / Dart ≥3.8, run "flutter
analyze" and "dart fix --apply" to resolve violations for the new lints (notably
strict_top_level_inference and unnecessary_underscores), and fix any remaining
issues surfaced by analysis.
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 945f483 and 1b737da.

📒 Files selected for processing (3)
  • apps/app_core/lib/app/app.dart
  • packages/app_notification_service/lib/src/notification_interface.dart
  • pubspec.yaml
🧰 Additional context used
📓 Path-based instructions (1)
**/*.dart

📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)

**/*.dart: Use generated Assets class from flutter_gen for asset access instead of raw string paths like Image.asset("assets/...")
For PNG/JPG images in assets, use the .image() method from generated Assets class (e.g., Assets.images.demo.image())
For SVG assets in assets, use the .svg() method from generated Assets class (e.g., Assets.icons.home.svg())
Use .path property from generated Assets class when raw asset path strings are needed (e.g., Assets.images.demo.path)
Use .provider() method from generated Assets class when ImageProvider is needed for widgets like CircleAvatar or precacheImage

**/*.dart: Use context.t for accessing translations instead of hardcoded strings in Flutter widgets
Use VSpace and HSpace components for spacing instead of raw SizedBox widgets
Use AppButton component instead of raw Material buttons like ElevatedButton or TextButton
Use predefined AppText components (AppText.small(), AppText.medium(), AppText.large()) for text rendering
Use AppBorderRadius constants (small, medium, large) instead of raw border radius values
Use Insets constants for padding and margins instead of raw EdgeInsets values
Use AppLoadingIndicator component for showing loading states
Use AppButton with isExpanded: true for full-width buttons and isEnabled property for controlling button state
Use AppButton variants (secondary, outline, text, destructive) for different button styles instead of creating custom button implementations
Use AppCard component for card-based layouts instead of raw Card or Container widgets
Use AppTextField component for text input fields instead of raw Material TextField widgets

**/*.dart: Use context.colorScheme to access colors instead of hardcoded color values, following Material Design conventions
Use AppText widget instead of Text widget to utilize consistent typography
Use context.textTheme to access text styles instead of defining custom styles

...

Files:

  • apps/app_core/lib/app/app.dart
  • packages/app_notification_service/lib/src/notification_interface.dart
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*.dart : Use `Future<void>` as the return type of asynchronous members that do not produce values

Applied to files:

  • apps/app_core/lib/app/app.dart
  • packages/app_notification_service/lib/src/notification_interface.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization

Applied to files:

  • apps/app_core/lib/app/app.dart
  • packages/app_notification_service/lib/src/notification_interface.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/app_router.dart : After adding new routes, always run `melos run build-runner` command to generate route code

Applied to files:

  • pubspec.yaml
🔇 Additional comments (2)
apps/app_core/lib/app/app.dart (1)

124-129: Approve async disposal pattern with proper ordering.

The conversion of dispose() to Future<void> dispose() async correctly enables asynchronous cleanup. The ordering is appropriate with super.dispose() called last, as required by Flutter's State lifecycle.

Based on learnings, this follows the best practice of using Future<void> for asynchronous members that do not produce values and implements proper disposal management.

packages/app_notification_service/lib/src/notification_interface.dart (1)

20-20: Add await to the NotificationServiceInterface.dispose() call site.

The asynchronous signature change is correct, but the implementation is incomplete. Line 127 in apps/app_core/lib/app/app.dart calls getIt<NotificationServiceInterface>().dispose() without awaiting it. Since dispose() now returns Future<void>, this call must be awaited to ensure cleanup operations complete before the method returns:

await getIt<NotificationServiceInterface>().dispose();

Without await, resource cleanup will not complete, leading to potential memory leaks.

⛔ Skipped due to learnings
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*.dart : Use `Future<void>` as the return type of asynchronous members that do not produce values

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @apps/app_core/lib/app/app.dart:
- Around line 123-129: The dispose method must be synchronous; change the
override from Future<void> dispose() async to void dispose() and keep
NetWorkInfoService.instance.dispose() and _connectivityService.dispose()
synchronous, then fire-and-forget the async cleanup of the
NotificationServiceInterface using unawaited(...) so the override matches
State.dispose(); guard the getIt lookup (e.g., check registration or wrap in
try/catch) before calling getIt<NotificationServiceInterface>().dispose() and
ensure errors from the async disposal are caught/logged inside the unawaited
call.
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1b737da and 7435019.

📒 Files selected for processing (1)
  • apps/app_core/lib/app/app.dart
🧰 Additional context used
📓 Path-based instructions (1)
**/*.dart

📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)

**/*.dart: Use generated Assets class from flutter_gen for asset access instead of raw string paths like Image.asset("assets/...")
For PNG/JPG images in assets, use the .image() method from generated Assets class (e.g., Assets.images.demo.image())
For SVG assets in assets, use the .svg() method from generated Assets class (e.g., Assets.icons.home.svg())
Use .path property from generated Assets class when raw asset path strings are needed (e.g., Assets.images.demo.path)
Use .provider() method from generated Assets class when ImageProvider is needed for widgets like CircleAvatar or precacheImage

**/*.dart: Use context.t for accessing translations instead of hardcoded strings in Flutter widgets
Use VSpace and HSpace components for spacing instead of raw SizedBox widgets
Use AppButton component instead of raw Material buttons like ElevatedButton or TextButton
Use predefined AppText components (AppText.small(), AppText.medium(), AppText.large()) for text rendering
Use AppBorderRadius constants (small, medium, large) instead of raw border radius values
Use Insets constants for padding and margins instead of raw EdgeInsets values
Use AppLoadingIndicator component for showing loading states
Use AppButton with isExpanded: true for full-width buttons and isEnabled property for controlling button state
Use AppButton variants (secondary, outline, text, destructive) for different button styles instead of creating custom button implementations
Use AppCard component for card-based layouts instead of raw Card or Container widgets
Use AppTextField component for text input fields instead of raw Material TextField widgets

**/*.dart: Use context.colorScheme to access colors instead of hardcoded color values, following Material Design conventions
Use AppText widget instead of Text widget to utilize consistent typography
Use context.textTheme to access text styles instead of defining custom styles

...

Files:

  • apps/app_core/lib/app/app.dart
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization

Applied to files:

  • apps/app_core/lib/app/app.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*.dart : Use `Future<void>` as the return type of asynchronous members that do not produce values

Applied to files:

  • apps/app_core/lib/app/app.dart

- Changed `dispose()` signature from `Future<void>` to `void`.
- Wrapped the asynchronous `NotificationServiceInterface.dispose()` call in `unawaited()`.
- Added `dart:async` import.
- Configured Flutter workspace in `pubspec.yaml` including `app_core`, `api_client`, `app_notification_service`, `app_subscription`, `app_translations`, `app_ui`, and `widgetbook`.
- Removed `pubspec_overrides.yaml` files in favor of workspace-based resolution.
- Updated `app_core/pubspec.yaml` to use workspace packages without explicit versions.
- Upgraded `widgetbook` related dependencies to `^3.20.2` and `flutter_lints` to `^6.0.0`.
- Updated `very_good_analysis` to `^10.0.0` in `app_ui`.
- Refactored `melos.yaml` scripts for better consistency and performance.
- Cleaned up numerous `// ignore` comments across the codebase (e.g., `unused_field`, `public_member_api_docs`, `unused_element`).
- Simplified `AppRouter` configuration by removing `replaceInRouteName`.
- Updated IntelliJ run configurations to execute Melos commands in the terminal.
- Minor code refactoring for boolean checks and explicit type declarations in `app_core`.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Fix all issues with AI agents
In @apps/app_core/pubspec.yaml:
- Line 49: Remove the unused dependency by deleting the image_cropper: ^11.0.0
entry from pubspec.yaml, run flutter pub get (or dart pub get) and run the
test/build to ensure nothing breaks; verify get_it usage in the codebase only
calls getIt<T>() (no custom reset/dispose or LIFO-dependent logic) so no code
changes are required for get_it: ^9.2.0, and leave sign_in_with_apple: ^7.0.1
as-is since its usage is compatible.

In @melos.yaml:
- Around line 8-12: The melos script "analyze" contains conflicting blocks: both
a top-level run and an exec block; melos will ignore exec when run is present.
Fix by choosing one behavior: either remove the exec section to keep a single
root-level command (retain analyze.run: "dart analyze . --fatal-infos" and
delete analyze.exec), or remove the run entry and convert the command into exec
with concurrency (replace analyze.run with analyze.exec: command to run
per-package and keep exec.concurrency: 10). Ensure you update the "analyze"
stanza to contain only the chosen run OR exec keys.
- Around line 73-78: The format task currently defines both a top-level run
script and an exec block (including concurrency), which conflict — pick one
approach and remove the other: either delete the exec block (and its concurrency
setting) and keep the workspace-level run commands under format.run
(functionally running dart format & dart fix once), or remove the run block and
move the formatting commands into format.exec so they run per-package with the
existing concurrency control; update only the format task entries (format.run or
format.exec) and ensure no duplicate run/exec keys remain.

In @packages/api_client/pubspec.yaml:
- Around line 10-31: pubspec.yaml now pins flutter_lints ^6.0.0 which requires
newer Flutter/Dart SDKs and introduces rules like strict_top_level_inference;
update the SDK environment constraints in pubspec.yaml (environment: sdk and
flutter version bounds) to meet flutter_lints 6.0.0 minimums, run the analyzer
to surface new lint violations (especially strict_top_level_inference and
unnecessary_underscores), and fix offending symbols by adding explicit types to
top-level variables/functions or adjusting names to remove unnecessary
underscores; ensure hive_ce/hive_ce_flutter and any generated code remain
compatible and adjust or pin flutter_lints if upgrading the SDK is not feasible.

In @packages/app_notification_service/pubspec.yaml:
- Around line 15-21: Update analysis_options.yaml to import
package:very_good_analysis/analysis_options.10.0.0.yaml and ensure the merged
config handles flutter_lints v6.0.0 changes; then run flutter analyze and fix or
suppress new lints (notably strict_top_level_inference) and re-enable/replace
any removed rules such as diagnostic_describe_all_properties so CI won’t fail.

In @packages/app_subscription/pubspec.yaml:
- Around line 9-10: Update the Flutter SDK constraint in pubspec.yaml to meet
the minimum required by in_app_purchase:^3.2.3 by changing the
environment.flutter entry to ">=3.24.0" (leave the Dart SDK constraint ^3.7.2
as-is); verify this change in the same pubspec where packages like
in_app_purchase, equatable, and flutter_lints are declared so the Flutter
constraint matches those package requirements.

In @packages/app_translations/pubspec.yaml:
- Around line 10-11: The pubspec currently lists melos as a per-package
dev_dependency; remove the melos: ^7.3.0 entry from this package's
dev_dependencies so melos is only declared at the repository root (keep other
dev_dependencies like build_runner unchanged).

In @packages/widgetbook/pubspec.yaml:
- Line 20: The pubspec currently lists flutter_lints (^6.0.0) under
dependencies; move the flutter_lints entry out of dependencies and add it under
dev_dependencies instead (keeping the ^6.0.0 constraint) so lint packages are
only used during development; update pubspec.yaml by removing flutter_lints from
the dependencies map and adding the same entry to the dev_dependencies map.
🧹 Nitpick comments (4)
apps/app_core/lib/core/presentation/widgets/force_update_widget.dart (1)

2-3: Redundant import.

flutter/material.dart already re-exports everything from flutter/widgets.dart, so line 3 can be removed.

🧹 Suggested cleanup
 import 'package:app_core/core/data/services/force_update_client.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
apps/app_core/lib/modules/subscription/cubit/subscription_cubit.dart (1)

32-68: Consider managing the purchase stream subscription + async error handling.

Right now the listener isn’t cancelled in close(), and the async listen callback’s Future is ignored (risk of unhandled async errors). Storing the StreamSubscription and cancelling on close() would make this more robust. Based on learnings, prefer explicit typing where it’s not obvious (same rationale applies to a StreamSubscription field).

Proposed refactor
+import 'dart:async';
 import 'dart:io';

 // ...

 class SubscriptionCubit extends Cubit<SubscriptionState> {
   SubscriptionCubit(this.repository, this.context)
     : super(const SubscriptionState()) {
     repository.init(context);
     listenToPurchaseStream(context);
   }

   final SubscriptionRepository repository;
   final BuildContext context;
   final CustomInAppPurchase _inAppPurchase = getIt<CustomInAppPurchase>();
+  StreamSubscription<dynamic>? _purchaseSubscription;

   Future<void> listenToPurchaseStream(BuildContext context) async {
-    _inAppPurchase.getPurchaseStream().listen((purchaseDetails) async {
+    _purchaseSubscription = _inAppPurchase.getPurchaseStream().listen(
+      (purchaseDetails) => unawaited(_handlePurchase(purchaseDetails)),
+      onError: (Object error, StackTrace st) {
+        flog('purchase stream error: $error');
+        emit(state.copyWith(status: SubscriptionStateStatus.purchaseFailed));
+      },
+    );
+  }
+
+  Future<void> _handlePurchase(dynamic purchaseDetails) async {
       if (purchaseDetails.status == PurchaseStatus.pending) {
       } else if (purchaseDetails.status == PurchaseStatus.purchased) {
         await _inAppPurchase.completePendingPurchases();
         Platform.isIOS
               ? await repository
                   .verifyPaymentForIOS(
                     purchaseToken:
                         purchaseDetails.verificationData.serverVerificationData,
                   )
                   .run()
               : await repository
                   .verifyPaymentForAndroid(
                     productId: purchaseDetails.productID,
                     purchaseToken:
                         purchaseDetails.verificationData.serverVerificationData,
                   )
                   .run()
           ..fold(
             (l) => emit(
               state.copyWith(status: SubscriptionStateStatus.purchaseFailed),
             ),
             (r) => emit(
               state.copyWith(status: SubscriptionStateStatus.purchaseSuccess),
             ),
           );
       } else if (purchaseDetails.status == PurchaseStatus.canceled) {
         emit(state.copyWith(status: SubscriptionStateStatus.purchaseCancelled));
       } else if (purchaseDetails.status == PurchaseStatus.error) {
         flog('purchase details in the error state: ${purchaseDetails.error}');
         emit(state.copyWith(status: SubscriptionStateStatus.purchaseFailed));
       } else if (purchaseDetails.status == PurchaseStatus.restored) {
         emit(state.copyWith(status: SubscriptionStateStatus.purchaseRestored));
       }
-    });
   }

   @override
   Future<void> close() async {
     flog('subscription cubit on close');
+    await _purchaseSubscription?.cancel();
     await repository.dispose(context);
     return super.close();
   }
 }

Also applies to: 169-174

pubspec.yaml (1)

23-25: Add comments explaining why dependency_overrides are needed.

Dependency overrides can hide version conflicts and complicate debugging. Document why web and source_gen need to be pinned to specific versions to help future maintainers understand the constraints.

Suggested documentation
 dependency_overrides:
+  # Required for compatibility with Flutter 3.29+ workspace resolution
   web: ^1.1.1
+  # Required until dependent packages update their source_gen constraints
   source_gen: ^4.1.1
apps/app_core/lib/app/helpers/injection.dart (1)

4-8: Good: explicit RestApiClient typing (stronger DI contract).
Consider making these late final (or getters) to avoid import-time GetIt resolution / init-order issues, and centralize instanceName strings.

Proposed refactor (lazy resolution + constants)
 import 'package:api_client/api_client.dart';
 import 'package:get_it/get_it.dart';

 final GetIt getIt = GetIt.instance;

-final RestApiClient userApiClient = getIt.get<RestApiClient>(instanceName: 'user');
+const String _userRestApiClientInstanceName = 'user';
+const String _baseRestApiClientInstanceName = 'base';
+
+late final RestApiClient userApiClient =
+    getIt.get<RestApiClient>(instanceName: _userRestApiClientInstanceName);

-final RestApiClient baseApiClient = getIt.get<RestApiClient>(instanceName: 'base');
+late final RestApiClient baseApiClient =
+    getIt.get<RestApiClient>(instanceName: _baseRestApiClientInstanceName);
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0b85a02 and b749ed9.

📒 Files selected for processing (40)
  • .idea/runConfigurations/melos_bootstrap.xml
  • .idea/runConfigurations/melos_clean.xml
  • .idea/runConfigurations/melos_run_analyze.xml
  • .idea/runConfigurations/melos_run_asset_gen.xml
  • .idea/runConfigurations/melos_run_build_apk.xml
  • .idea/runConfigurations/melos_run_build_bundle.xml
  • .idea/runConfigurations/melos_run_build_ipa.xml
  • .idea/runConfigurations/melos_run_build_runner.xml
  • .idea/runConfigurations/melos_run_format.xml
  • .idea/runConfigurations/melos_run_go_ios_go.xml
  • .idea/runConfigurations/melos_run_locale_gen.xml
  • .idea/runConfigurations/melos_run_widgetbook_gen.xml
  • apps/app_core/lib/app/helpers/injection.dart
  • apps/app_core/lib/app/observers/app_bloc_observer.dart
  • apps/app_core/lib/app/routes/app_router.dart
  • apps/app_core/lib/bootstrap.dart
  • apps/app_core/lib/core/data/models/pagination_model.dart
  • apps/app_core/lib/core/data/services/media.service.dart
  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
  • apps/app_core/lib/modules/auth/repository/auth_repository.dart
  • apps/app_core/lib/modules/auth/sign_in/bloc/sign_in_bloc.dart
  • apps/app_core/lib/modules/auth/sign_up/bloc/sign_up_state.dart
  • apps/app_core/lib/modules/home/repository/home_repository.dart
  • apps/app_core/lib/modules/profile/bloc/profile_state.dart
  • apps/app_core/lib/modules/profile/repository/profile_repository.dart
  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
  • apps/app_core/lib/modules/subscription/cubit/subscription_cubit.dart
  • apps/app_core/pubspec.yaml
  • apps/app_core/pubspec_overrides.yaml
  • melos.yaml
  • packages/api_client/pubspec.yaml
  • packages/app_notification_service/pubspec.yaml
  • packages/app_subscription/pubspec.yaml
  • packages/app_translations/pubspec.yaml
  • packages/app_ui/lib/src/theme/data/colors.dart
  • packages/app_ui/lib/src/widgets/molecules/app_network_image.dart
  • packages/app_ui/pubspec.yaml
  • packages/widgetbook/pubspec.yaml
  • packages/widgetbook/pubspec_overrides.yaml
  • pubspec.yaml
💤 Files with no reviewable changes (24)
  • apps/app_core/lib/modules/auth/repository/auth_repository.dart
  • packages/app_ui/lib/src/widgets/molecules/app_network_image.dart
  • apps/app_core/lib/bootstrap.dart
  • .idea/runConfigurations/melos_run_go_ios_go.xml
  • apps/app_core/lib/modules/profile/bloc/profile_state.dart
  • apps/app_core/lib/app/observers/app_bloc_observer.dart
  • apps/app_core/lib/core/data/models/pagination_model.dart
  • .idea/runConfigurations/melos_run_analyze.xml
  • .idea/runConfigurations/melos_run_asset_gen.xml
  • packages/widgetbook/pubspec_overrides.yaml
  • .idea/runConfigurations/melos_run_build_bundle.xml
  • apps/app_core/lib/modules/auth/sign_in/bloc/sign_in_bloc.dart
  • .idea/runConfigurations/melos_run_locale_gen.xml
  • .idea/runConfigurations/melos_run_build_apk.xml
  • .idea/runConfigurations/melos_run_format.xml
  • packages/app_ui/lib/src/theme/data/colors.dart
  • apps/app_core/pubspec_overrides.yaml
  • apps/app_core/lib/core/data/services/media.service.dart
  • .idea/runConfigurations/melos_run_build_ipa.xml
  • .idea/runConfigurations/melos_run_build_runner.xml
  • .idea/runConfigurations/melos_run_widgetbook_gen.xml
  • apps/app_core/lib/modules/home/repository/home_repository.dart
  • apps/app_core/lib/modules/profile/repository/profile_repository.dart
  • apps/app_core/lib/modules/auth/sign_up/bloc/sign_up_state.dart
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/app_ui/pubspec.yaml
🧰 Additional context used
📓 Path-based instructions (5)
**/*.dart

📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)

**/*.dart: Use generated Assets class from flutter_gen for asset access instead of raw string paths like Image.asset("assets/...")
For PNG/JPG images in assets, use the .image() method from generated Assets class (e.g., Assets.images.demo.image())
For SVG assets in assets, use the .svg() method from generated Assets class (e.g., Assets.icons.home.svg())
Use .path property from generated Assets class when raw asset path strings are needed (e.g., Assets.images.demo.path)
Use .provider() method from generated Assets class when ImageProvider is needed for widgets like CircleAvatar or precacheImage

**/*.dart: Use context.t for accessing translations instead of hardcoded strings in Flutter widgets
Use VSpace and HSpace components for spacing instead of raw SizedBox widgets
Use AppButton component instead of raw Material buttons like ElevatedButton or TextButton
Use predefined AppText components (AppText.small(), AppText.medium(), AppText.large()) for text rendering
Use AppBorderRadius constants (small, medium, large) instead of raw border radius values
Use Insets constants for padding and margins instead of raw EdgeInsets values
Use AppLoadingIndicator component for showing loading states
Use AppButton with isExpanded: true for full-width buttons and isEnabled property for controlling button state
Use AppButton variants (secondary, outline, text, destructive) for different button styles instead of creating custom button implementations
Use AppCard component for card-based layouts instead of raw Card or Container widgets
Use AppTextField component for text input fields instead of raw Material TextField widgets

**/*.dart: Use context.colorScheme to access colors instead of hardcoded color values, following Material Design conventions
Use AppText widget instead of Text widget to utilize consistent typography
Use context.textTheme to access text styles instead of defining custom styles

...

Files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
  • apps/app_core/lib/app/helpers/injection.dart
  • apps/app_core/lib/modules/subscription/cubit/subscription_cubit.dart
  • apps/app_core/lib/app/routes/app_router.dart
  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
**/*_widget.dart

📄 CodeRabbit inference engine (.cursor/rules/flutter-dart.mdc)

**/*_widget.dart: Extract reusable widgets into separate components
Use StatelessWidget when possible
Keep build methods simple and focused
Avoid unnecessary StatefulWidgets
Keep state as local as possible
Use const constructors when possible
Avoid expensive operations in build methods
Implement pagination for large lists
If you get a 'RenderFlex overflowed' error, check if a Row or Column contains unconstrained widgets. Fix by wrapping children in Flexible, Expanded, or by setting constraints.
If you get 'Vertical viewport was given unbounded height', ensure ListView or similar scrollable widgets inside a Column have a bounded height
If you get 'An InputDecorator...cannot have an unbounded width', constrain the width of widgets like TextField
If you get a 'setState called during build' error, do not call setState or showDialog directly inside the build method
If you get 'The ScrollController is attached to multiple scroll views', make sure each ScrollController is only attached to a single scrollable widget
If you get a 'RenderBox was not laid out' error, check for missing or unbounded constraints in your widget tree
Use the Flutter Inspector and review widget constraints to debug layout issues

Files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
**/app_router.dart

📄 CodeRabbit inference engine (.cursor/rules/auto-route.mdc)

**/app_router.dart: In app_router.dart, use @AutoRouterConfig(replaceInRouteName: 'Page|Screen,Route') annotation and define routes in the routes list using AutoRoute configuration
After adding new routes, always run melos run build-runner command to generate route code

Files:

  • apps/app_core/lib/app/routes/app_router.dart
**/*screen.dart

📄 CodeRabbit inference engine (.cursor/rules/auto-route.mdc)

**/*screen.dart: Annotate screen widgets with @RoutePage() decorator directly above the class declaration for Auto Route navigation
For simple screens without state management, implement screen widgets as StatelessWidget with @RoutePage() annotation
For screens requiring state management with BLoC/Cubit, extend StatefulWidget and implement AutoRouteWrapper interface with MultiRepositoryProvider and MultiBlocProvider setup
Use BackButtonListener instead of PopScope in Flutter Auto Route projects to avoid conflicts
When using BLoC in screens, implement AutoRouteWrapper interface and initialize BLoCs with lazy: false in MultiBlocProvider for immediate initialization when appropriate
Return this as the child widget in AutoRouteWrapper's wrappedRoute method after setting up MultiRepositoryProvider and MultiBlocProvider

Files:

  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
**/*_screen.dart

📄 CodeRabbit inference engine (.cursor/rules/bloc.mdc)

**/*_screen.dart: Implement AutoRouteWrapper in screen classes for scoped provider injection
Use RepositoryProvider to provide repository instances in screen wrappedRoute method
Use BlocProvider with lazy: false for immediate BLoC initialization and add initial events in screen wrappedRoute

To coordinate between blocs, use BlocListener in the presentation layer to listen to one bloc and add events to another

Files:

  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
🧠 Learnings (26)
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Keep build methods simple and focused

Applied to files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
  • packages/widgetbook/pubspec.yaml
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Avoid unnecessary `StatefulWidget`s

Applied to files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Keep state as local as possible

Applied to files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Avoid expensive operations in build methods

Applied to files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : If you get a 'setState called during build' error, do not call `setState` or `showDialog` directly inside the build method

Applied to files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Extract reusable widgets into separate components

Applied to files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
  • packages/widgetbook/pubspec.yaml
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Check current state before emitting new states in BLoC event handlers to prevent unnecessary emissions

Applied to files:

  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*.dart : Type annotate fields and top-level variables if the type isn't obvious

Applied to files:

  • apps/app_core/lib/app/helpers/injection.dart
  • apps/app_core/lib/modules/subscription/cubit/subscription_cubit.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/app_router.dart : After adding new routes, always run `melos run build-runner` command to generate route code

Applied to files:

  • melos.yaml
  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Inject repository through BLoC constructor rather than creating instances internally

Applied to files:

  • apps/app_core/lib/modules/subscription/cubit/subscription_cubit.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/app_router.dart : In app_router.dart, use AutoRouterConfig(replaceInRouteName: 'Page|Screen,Route') annotation and define routes in the routes list using AutoRoute configuration

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Annotate screen widgets with `RoutePage()` decorator directly above the class declaration for Auto Route navigation

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : For simple screens without state management, implement screen widgets as StatelessWidget with RoutePage() annotation

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_screen.dart : Implement AutoRouteWrapper in screen classes for scoped provider injection

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Use BackButtonListener instead of PopScope in Flutter Auto Route projects to avoid conflicts

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:01:21.169Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/color.mdc:0-0
Timestamp: 2026-01-08T09:01:21.169Z
Learning: Applies to **/*.dart : Use AppText widget instead of Text widget to utilize consistent typography

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppCard` component for card-based layouts instead of raw `Card` or `Container` widgets

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppBorderRadius` constants (`small`, `medium`, `large`) instead of raw border radius values

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Return `this` as the child widget in AutoRouteWrapper's wrappedRoute method after setting up MultiRepositoryProvider and MultiBlocProvider

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : For screens requiring state management with BLoC/Cubit, extend StatefulWidget and implement AutoRouteWrapper interface with MultiRepositoryProvider and MultiBlocProvider setup

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : When using BLoC in screens, implement AutoRouteWrapper interface and initialize BLoCs with lazy: false in MultiBlocProvider for immediate initialization when appropriate

Applied to files:

  • apps/app_core/lib/app/routes/app_router.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_screen.dart : To coordinate between blocs, use BlocListener in the presentation layer to listen to one bloc and add events to another

Applied to files:

  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_state.dart : Implement copyWith method for incremental state updates in Flutter BLoC State classes

Applied to files:

  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_screen.dart : Use BlocProvider with lazy: false for immediate BLoC initialization and add initial events in screen wrappedRoute

Applied to files:

  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_event.dart : Use Equatable for event class comparison in Flutter BLoC

Applied to files:

  • apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Use the Flutter Inspector and review widget constraints to debug layout issues

Applied to files:

  • packages/widgetbook/pubspec.yaml
🔇 Additional comments (12)
apps/app_core/lib/core/presentation/widgets/force_update_widget.dart (1)

104-104: LGTM!

The simplification from allowCancel == false to !allowCancel is functionally equivalent and more idiomatic Dart. The control flow logic remains correct: the alert re-triggers only when the user presses the Android back button (success == null) and cancellation is not allowed.

apps/app_core/lib/app/routes/app_router.dart (1)

20-20: No changes needed — the annotation is correct for auto_route 10.3.0.

The replaceInRouteName parameter was redundant. auto_route 10.3.0 applies the 'Page|Screen,Route' replacement by default, so the explicit parameter is unnecessary. Routes will still be generated correctly (e.g., SignInScreenSignInRoute).

Likely an incorrect or invalid review comment.

.idea/runConfigurations/melos_bootstrap.xml (1)

9-9: Good IDE QoL change; keep XML formatting consistent.

Running melos bootstrap in a terminal is typically better for interactive output. Minor nit: consider matching the existing self-closing tag style (... value="true" />) for consistency.

apps/app_core/lib/modules/subscription/cubit/subscription_cubit.dart (1)

26-26: Nice: explicit _inAppPurchase type improves clarity and upgrade-safety.

.idea/runConfigurations/melos_clean.xml (1)

9-9: Consistent with bootstrap config; good.

Same minor formatting nit as the other run config: consider value="true" /> for consistency with the rest of the file.

pubspec.yaml (1)

14-21: Workspace setup and melos upgrade look good.

The workspace configuration correctly lists all packages. The melos upgrade from ^6.3.2 to ^7.3.0 is a major version bump — ensure the updated melos.yaml scripts are compatible with melos 7.x syntax.

Also applies to: 31-31

apps/app_core/pubspec.yaml (2)

22-27: Workspace package references correctly configured.

Using package names without versions is the correct approach for workspace resolution, allowing Pub to resolve versions from the workspace root.


33-33: No action needed. envied at ^1.3.2 and envied_generator at ^1.1.1 are fully compatible. The generator's constraint ^1.1.0 explicitly accepts all versions from 1.1.0 to below 2.0.0, which includes 1.3.2. Consider updating envied_generator to its latest version ^1.3.2 for closer alignment, but the current pairing introduces no compatibility issues.

Likely an incorrect or invalid review comment.

melos.yaml (1)

14-21: Script refactoring improvements look good.

The updates to build-runner, asset-gen, go-ios-go, and widgetbook-gen scripts are well-structured:

  • Adding --delete-conflicting-outputs is a good practice for build_runner
  • The go-ios-go multi-line script with explicit cleanup steps is cleaner
  • Consistent use of dart run instead of flutter pub run

Also applies to: 23-28, 58-65, 67-71

packages/widgetbook/pubspec.yaml (1)

18-19: Widgetbook upgrade verified — SDK minimum version requirements confirmed compatible.

The upgrade to widgetbook 3.20.2 and widgetbook_annotation 3.9.0 is compatible. The breaking change is a minimum Dart SDK 3.8.0 and Flutter 3.32.0 requirement. Verify your project targets meet these minimums. The precision parameter on DoubleSliderField has a sensible default if double sliders are used.

apps/app_core/lib/modules/profile/screen/edit_profile_screen.dart (1)

38-49: Boolean simplification is safe here (null/false won’t trigger).
This keeps the same semantics as the prior == true check while reading cleaner.

packages/app_notification_service/pubspec.yaml (1)

5-10: The workspace configuration is correctly set up. The root pubspec.yaml defines the workspace with all packages listed (including app_notification_service), and all workspace packages have resolution: workspace consistently applied. The SDK constraint (3.7.2+) meets the pub workspaces minimum requirement (3.6.0), so pub get and CI will resolve dependencies consistently across all packages using a shared pubspec.lock at the workspace root.

melos.yaml Outdated
Comment on lines 8 to 12
analyze:
packageFilters:
scopes:
- packages/**
- apps/**
run: |
melos exec -c 10 -- \
dart analyze . --fatal-infos
description: Analyze all Dart & Flutter packages
run: dart analyze . --fatal-infos
exec:
concurrency: 10
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Conflicting run and exec blocks in analyze script.

In melos, run executes a single command from the workspace root, while exec runs a command across multiple packages with concurrency. Having both is contradictory — the exec block will be ignored when run is present.

If you want to analyze each package concurrently, use exec without run. If you want a single analysis from the root, remove the exec block.

Option 1: Use exec for per-package analysis
 analyze:
   description: Analyze all Dart & Flutter packages
-  run: dart analyze . --fatal-infos
   exec:
+    dart analyze . --fatal-infos
     concurrency: 10
Option 2: Keep single run, remove exec
 analyze:
   description: Analyze all Dart & Flutter packages
   run: dart analyze . --fatal-infos
-  exec:
-    concurrency: 10
🤖 Prompt for AI Agents
In @melos.yaml around lines 8 - 12, The melos script "analyze" contains
conflicting blocks: both a top-level run and an exec block; melos will ignore
exec when run is present. Fix by choosing one behavior: either remove the exec
section to keep a single root-level command (retain analyze.run: "dart analyze .
--fatal-infos" and delete analyze.exec), or remove the run entry and convert the
command into exec with concurrency (replace analyze.run with analyze.exec:
command to run per-package and keep exec.concurrency: 10). Ensure you update the
"analyze" stanza to contain only the chosen run OR exec keys.

melos.yaml Outdated
Comment on lines 73 to 78
format:
description: Formats the files
description: Format & fix Dart code
run: |
melos exec -c 10 -- \
dart format . --line-length 70 --output=none && dart fix --apply --code=require_trailing_commas
dart format . --line-length 70 --output=none
dart fix --apply --code=require_trailing_commas
exec:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Same run/exec conflict in format script.

The exec block with concurrency won't apply since run is present. Choose one approach:

Option 1: Use exec for per-package formatting
 format:
   description: Format & fix Dart code
-  run: |
-    dart format . --line-length 70 --output=none
-    dart fix --apply --code=require_trailing_commas
   exec:
-    concurrency: 10
+    run: |
+      dart format . --line-length 70 --output=none
+      dart fix --apply --code=require_trailing_commas
+    concurrency: 10
Option 2: Remove exec block for workspace-level formatting
 format:
   description: Format & fix Dart code
   run: |
     dart format . --line-length 70 --output=none
     dart fix --apply --code=require_trailing_commas
-  exec:
-    concurrency: 10
🤖 Prompt for AI Agents
In @melos.yaml around lines 73 - 78, The format task currently defines both a
top-level run script and an exec block (including concurrency), which conflict —
pick one approach and remove the other: either delete the exec block (and its
concurrency setting) and keep the workspace-level run commands under format.run
(functionally running dart format & dart fix once), or remove the run block and
move the formatting commands into format.exec so they run per-package with the
existing concurrency control; update only the format task entries (format.run or
format.exec) and ensure no duplicate run/exec keys remain.

Comment on lines +10 to +31
resolution: workspace

dependencies:
# API Calling
graphql: ^5.2.0-beta.7
graphql: ^5.2.3

# For functional programming
fpdart: ^1.1.1
dio: ^5.8.0+1
fpdart: ^1.2.0
dio: ^5.9.0
dio_cache_interceptor: ^3.5.1
dio_cache_interceptor_hive_store: ^4.0.0
path_provider: ^2.1.5
pretty_dio_logger: ^1.4.0
hive_ce: ^2.10.1
hive_ce_flutter: ^2.2.0
hive_ce: ^2.16.0
hive_ce_flutter: ^2.3.3


dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^5.0.0
hive_ce_generator: ^1.8.2
flutter_lints: ^6.0.0
hive_ce_generator: ^1.11.0
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# First, let's examine the actual pubspec.yaml file
cat -n packages/api_client/pubspec.yaml | head -40

Repository: 7span/dashing-kit

Length of output: 886


🏁 Script executed:

# Check git history to see what changed
git diff HEAD~1..HEAD -- packages/api_client/pubspec.yaml 2>/dev/null || git log --oneline -1 -- packages/api_client/pubspec.yaml 2>/dev/null || echo "Git info not available"

Repository: 7span/dashing-kit

Length of output: 139


🌐 Web query:

flutter_lints 6.0.0 changelog breaking changes

💡 Result:

Summary — flutter_lints 6.0.0 (breaking/important changes)

  • Bumps dependency on package:lints to 6.0.0 (introduces the new lint strict_top_level_inference). [1]
  • Minimum SDK requirement raised (pub.dev lists Flutter 3.3 / Dart 2.18). [1]
  • Note: an alternate changelog copy lists an additional lint added (unnecessary_underscores) and a higher SDK floor (Flutter 3.32 / Dart 3.8), so there is a discrepancy between sources — check the package page or your pubspec resolution for the authoritative values in your environment. [2]

Sources:
[1] flutter_lints changelog on pub.dev.
[2] flutter_lints CHANGELOG.md copy in packages repo (chromium/google mirror).


Dependency updates look reasonable, but verify flutter_lints 6.0.0 compatibility.

Moving graphql from beta to stable and updating other packages to latest versions is appropriate maintenance. The workspace resolution is correctly configured.

However, flutter_lints ^6.0.0 introduces breaking changes:

  • New lint rule: strict_top_level_inference (and possibly unnecessary_underscores)
  • Requires Flutter 3.3+ / Dart 2.18+ (or Flutter 3.32+ / Dart 3.8+ depending on source)

The pubspec.yaml currently allows flutter: ">=3.0.0", which may be below flutter_lints 6.0.0's minimum requirement. Verify:

  1. That the environment constraints are updated to match flutter_lints 6.0.0's requirements
  2. That existing code complies with the new lint rules, particularly strict_top_level_inference
🤖 Prompt for AI Agents
In @packages/api_client/pubspec.yaml around lines 10 - 31, pubspec.yaml now pins
flutter_lints ^6.0.0 which requires newer Flutter/Dart SDKs and introduces rules
like strict_top_level_inference; update the SDK environment constraints in
pubspec.yaml (environment: sdk and flutter version bounds) to meet flutter_lints
6.0.0 minimums, run the analyzer to surface new lint violations (especially
strict_top_level_inference and unnecessary_underscores), and fix offending
symbols by adding explicit types to top-level variables/functions or adjusting
names to remove unnecessary underscores; ensure hive_ce/hive_ce_flutter and any
generated code remain compatible and adjust or pin flutter_lints if upgrading
the SDK is not feasible.

Comment on lines +15 to +21
onesignal_flutter: ^5.3.5

dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^5.0.0
very_good_analysis: ^7.0.0
flutter_lints: ^6.0.0
very_good_analysis: ^10.0.0
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

onesignal_flutter 5.3.5 release notes breaking changes

💡 Result:

Short answer: There are no breaking changes listed for onesignal_flutter 5.3.5. The package 5.3.5 is published (latest on pub.dev) and the GitHub releases page shows breaking changes only for 5.3.0 (no breaking changes for the 5.3.x patch releases). [1][2]

Sources:

  • pub.dev onesignal_flutter (shows 5.3.5 as latest). [1]
  • OneSignal Flutter SDK releases (GitHub) — breaking changes called out at 5.3.0; 5.3.x releases are native dependency/bug-fix updates. [2]

🌐 Web query:

very_good_analysis 10.0.0 migration guide new lints flutter

💡 Result:

Here’s a concise migration checklist and the key changes to watch when moving to very_good_analysis 10.0.0 (Flutter/Dart):

Quick links (sources): very_good_analysis package & changelog. [1][2]

  1. Upgrade
  • Update dev dependency: flutter pub add --dev very_good_analysis (or change pubspec to ^10.0.0). [2]
  1. Update include
  • Switch your analysis_options include to the v10 file (optional pin):
    include: package:very_good_analysis/analysis_options.10.0.0.yaml
    Or keep the unpinned include to always get latest: package:very_good_analysis/analysis_options.yaml. [2]
  1. SDK and analyzer compatibility
  • v10.0.0 adds support for Dart 3.9.0 — ensure your SDK lower bound / toolchain is compatible. [1]
  1. New / changed lints and notable rule changes
  • v10.0.0 release notes: primarily SDK support and docs updates. Review the changelog for specific rule additions/changes. [1]
  • Pre-release notes: the rule diagnostic_describe_all_properties was removed in v10.0.0-rc.1 — search your codebase for usages/expectations of that diagnostic. [1][3]
  1. Migrate code / fix reported issues
  • Run: flutter analyze (or dart analyze).
  • Fix or suppress new lints as needed (use // ignore: or file/project-level excludes). [2]
  • If a new lint flags many cases, consider incremental fixes or adding justified suppressions while you refactor.
  1. Tests & CI
  • Run unit/widget tests and CI analyzers to catch any remaining lint failures.
  • If pinning analysis_options to 10.0.0, update CI tooling when you choose to move to newer prereleases (e.g., 10.1.0-rc.*). [2]

If you want, I can:

  • produce a diff of likely lint failures for a small sample file, or
  • list every lint added/removed between 9.x and 10.0.0 (I’ll fetch the full rule list from the package).

Sources:
[1] very_good_analysis changelog (v10.0.0).
[2] very_good_analysis package & usage (analysis_options include).
[3] very_good_analysis v10.0.0-rc.1 notes (rule removal).


🌐 Web query:

flutter_lints 6.0.0 release notes breaking changes

💡 Result:

Summary — flutter_lints 6.0.0 breaking changes

  • Main change: bumps its dependency on package:lints to 6.0.0 and adds the new linter rule strict_top_level_inference. This can surface new lint warnings/errors in projects after upgrading (no other breaking API changes are listed). [1][2]

Sources

  • flutter_lints changelog (pub.dev). [1]
  • Related GitHub discussion about bumping lints to ^6.0.0. [2]

Update analysis_options.yaml and run flutter analyze to verify lint rule compatibility.

The onesignal_flutter bump to 5.3.5 introduces no breaking changes and requires no platform configuration updates. However, the analysis toolchain bumps (very_good_analysis to 10.0.0 and flutter_lints to 6.0.0) require action:

  1. Update analysis_options.yaml to include the v10 analysis file: package:very_good_analysis/analysis_options.10.0.0.yaml
  2. Run flutter analyze to identify any new lints introduced by flutter_lints 6.0.0 (notably strict_top_level_inference) and removed rules (e.g., diagnostic_describe_all_properties)
  3. Address or suppress any new lint violations before merging to avoid CI failures
🤖 Prompt for AI Agents
In @packages/app_notification_service/pubspec.yaml around lines 15 - 21, Update
analysis_options.yaml to import
package:very_good_analysis/analysis_options.10.0.0.yaml and ensure the merged
config handles flutter_lints v6.0.0 changes; then run flutter analyze and fix or
suppress new lints (notably strict_top_level_inference) and re-enable/replace
any removed rules such as diagnostic_describe_all_properties so CI won’t fail.

…core`.

- Relocated `melos` configuration from `melos.yaml` into `pubspec.yaml` and updated script definitions to use `exec`.
- Integrated `mason` for brick management by adding `scripts/mason.yaml` and `scripts/mason-lock.json`.
- Added IDE run configurations for various Melos scripts.
- Refactored `dispose` methods and various UI event handlers (`onPressed`, `onTap`, `listener`) in `app_core` to be asynchronous.
- Updated `WebViewController` initialization in `WebviewScreen` to use `unawaited` for asynchronous calls and improved state safety with `mounted` checks.
- Migrated multiple `Widgetbook` knobs from `knobs.list` to `knobs.object.dropdown`.
- Replaced `DeviceFrameAddon` with `ViewportAddon` in `widgetbook/lib/main.dart`.
- Updated `build_runner` to version `^2.10.4` in `app_core` and bumped the minimum Flutter SDK version to `3.24.0` in `app_subscription`.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
apps/app_core/lib/core/presentation/screens/webview_screen.dart (1)

27-27: Critical bug: Inverted loading state logic prevents WebView from ever displaying.

The loading state management is broken:

  1. isLoading is initialized to false (line 27)
  2. onPageFinished sets isLoading = false (line 40)
  3. The UI shows the loading indicator when !isLoading is true (line 62)

This means the WebView will never be rendered since isLoading is never set to true.

🐛 Proposed fix
 class _WebViewScreenState extends State<WebViewScreen> {
   late WebViewController webViewController = WebViewController();
-  bool isLoading = false;
+  bool isLoading = true;

   @override
   void initState() {
     super.initState();
     webViewController = WebViewController();

     unawaited(
       webViewController.setNavigationDelegate(
         NavigationDelegate(
           onPageFinished: (_) {
             if (!mounted) return;
             setState(() {
               isLoading = false;
             });
           },
         ),
       ),
     );

     unawaited(
       webViewController.loadRequest(Uri.parse(widget.url ?? '')),
     );
   }

   @override
   Widget build(BuildContext context) {
     return AppScaffold(
       appBar: CustomAppBar(
         title: widget.title,
         automaticallyImplyLeading: true,
         backgroundColor: context.colorScheme.white,
       ),
       body:
-          !isLoading
-              ? const Center(child: AppCircularProgressIndicator())
-              : WebViewWidget(controller: webViewController),
+          isLoading
+              ? const Center(child: AppCircularProgressIndicator())
+              : WebViewWidget(controller: webViewController),
     );
   }
 }

Also applies to: 37-41, 62-64

apps/app_core/lib/core/data/services/network_helper.service.dart (1)

28-30: Redundant getter logic.

The isConnected getter returns the same value in both branches of the ternary expression. This should either return a bool or be simplified.

Suggested fix
-  ConnectionStatus get isConnected => connectionStatus == ConnectionStatus.online
-      ? ConnectionStatus.online
-      : ConnectionStatus.offline;
+  bool get isConnected => connectionStatus == ConnectionStatus.online;

Or if ConnectionStatus return type is intentional:

-  ConnectionStatus get isConnected => connectionStatus == ConnectionStatus.online
-      ? ConnectionStatus.online
-      : ConnectionStatus.offline;
+  ConnectionStatus get isConnected => connectionStatus;
apps/app_core/lib/core/data/services/connectivity_service.dart (1)

24-35: Resource leak: Stream subscription not stored or cancelled.

The subscription returned by _connectivity.onConnectivityChanged.listen() is not stored, so it cannot be cancelled in dispose(). This will cause a memory leak and the listener will continue running indefinitely.

Proposed fix
   final _connectivity = Connectivity();
   final _controller = StreamController<bool>.broadcast();
+  StreamSubscription<List<ConnectivityResult>>? _connectivitySubscription;
   bool _isDialogVisible = false;
   OverlayEntry? _overlayEntry;

   void initialize() {
-    _connectivity.onConnectivityChanged.listen((result) {
+    _connectivitySubscription = _connectivity.onConnectivityChanged.listen((result) {
       final isConnected = result.first != ConnectivityResult.none;
       _controller.add(isConnected);

       if (!isConnected) {
         _showNoInternetOverlay();
       } else {
         _removeNoInternetOverlay();
       }
     });
   }

Then update dispose():

   Future<void> dispose() async {
     _removeNoInternetOverlay();
+    await _connectivitySubscription?.cancel();
     await _controller.close();
   }

Based on learnings, proper stream subscription management is critical for memory optimization.

packages/widgetbook/lib/widgets/atoms/padding.dart (1)

34-42: Incorrect label values for large inset options.

The labels for Insets.xxxlarge66 and Insets.xxxxlarge80 incorrectly display "(40)" instead of their actual values "(66)" and "(80)".

🐛 Proposed fix
       if (paddingValue == Insets.xxxlarge66) {
-        return 'xxExtra Large (40)';
+        return 'xxExtra Large (66)';
       }
       if (paddingValue == Insets.xxxxlarge80) {
-        return 'xxxExtra Large (40)';
+        return 'xxxExtra Large (80)';
       }
apps/app_core/lib/app/helpers/permission/permission_helper.dart (1)

72-75: Remove the unused getData() method.

This method is not called anywhere in the codebase and can be safely removed.

🤖 Fix all issues with AI agents
In @apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart:
- Around line 27-31: The listener being async is ineffective because
ScrollController.addListener expects a VoidCallback and any Future is ignored;
fix by making onEndScroll/onTopScroll return Future<void>, update
_checkIfCanLoadMore() to be async and await those handlers before resetting the
guards (_canFetchBottom/_canFetchTop) so the flags actually prevent concurrent
loads, and change listener() to a synchronous VoidCallback that simply calls
_checkIfCanLoadMore() (fire-and-forget) or alternatively expose a completion
method for implementers to call when their async work finishes; update
references to listener(), _checkIfCanLoadMore(), onEndScroll(), onTopScroll(),
and the guard flags accordingly.

In @apps/app_core/pubspec.yaml:
- Line 33: The pubspec shows a version mismatch: the dependency "envied" is
^1.3.2 while the dev dependency "envied_generator" remains ^1.1.1; update the
"envied_generator" entry in pubspec.yaml to match the runtime package (set to
^1.3.2 or the same semver range as "envied"), save the file and run package
resolution (flutter pub get / dart pub get) to ensure the generator and runtime
are compatible.
- Line 78: Updating sign_in_with_apple to ^7.0.1 may introduce breaking changes:
scan codebase for any switch statements over AuthorizationErrorCode and add a
default/else branch to handle new cases; update any SignInWithAppleButton usages
to accept a nullable onPressed (check places calling SignInWithAppleButton and
guard against onPressed being null or pass a non-null wrapper); and ensure
pubspec.yaml’s environment sdk entry meets the new Flutter minimum (set the
Flutter SDK constraint to at least 3.19.0) or pin the package to a compatible
version if you cannot upgrade the SDK.
- Line 62: You upgraded image_cropper to 11.0.0 but haven’t applied required
platform/version changes: update the Flutter SDK constraint in pubspec.yaml to
at least 3.28 (adjust the sdk: "">=3.28.0 <4.0.0"" entry), raise the iOS
deployment target to ≥12.0 in ios/Podfile (platform :ios, '12.0') and in the
Xcode project settings (iOS Deployment Target), then run flutter clean &&
flutter pub get to refresh dependencies and ensure build settings are consistent
with the new image_cropper version.
🧹 Nitpick comments (10)
packages/widgetbook/lib/main.dart (1)

22-30: Consider adding more viewport configurations for comprehensive testing.

The migration from DeviceFrameAddon to ViewportAddon aligns with the widgetbook 3.x API changes. However, having only one viewport (iPhone 13) limits the ability to test UI components across different screen sizes and platforms.

♻️ Suggested additional viewports for better device coverage
 ViewportAddon([
   ViewportData(
     name: 'iPhone 13',
     width: 390,
     height: 844,
     pixelRatio: 3.0,
     platform: TargetPlatform.iOS,
   ),
+  ViewportData(
+    name: 'iPhone SE',
+    width: 375,
+    height: 667,
+    pixelRatio: 2.0,
+    platform: TargetPlatform.iOS,
+  ),
+  ViewportData(
+    name: 'Pixel 5',
+    width: 393,
+    height: 851,
+    pixelRatio: 2.75,
+    platform: TargetPlatform.android,
+  ),
+  ViewportData(
+    name: 'iPad Pro 11"',
+    width: 834,
+    height: 1194,
+    pixelRatio: 2.0,
+    platform: TargetPlatform.iOS,
+  ),
 ]),
apps/app_core/lib/core/presentation/screens/webview_screen.dart (1)

52-52: Remove stray blank line.

♻️ Proposed fix
     );
   }

-
   @override
   Widget build(BuildContext context) {
apps/app_core/lib/core/data/services/network_helper.service.dart (1)

10-24: Consider adding defensive check for uninitialized listener.

If dispose() is called before init(), accessing the late final listener will throw a LateInitializationError. Consider adding a null-safety pattern or initialization check.

Suggested defensive approach
-  late final StreamSubscription<DataConnectionStatus> listener;
+  StreamSubscription<DataConnectionStatus>? _listener;
+
   void init() {
-    listener = DataConnectionChecker().onStatusChange.listen((status) {
+    _listener = DataConnectionChecker().onStatusChange.listen((status) {
       switch (status) {
         case DataConnectionStatus.connected:
           connectionStatus = ConnectionStatus.online;
         case DataConnectionStatus.disconnected:
           connectionStatus = ConnectionStatus.offline;
       }
     });
   }

   Future<void> dispose() async {
-    await listener.cancel();
+    await _listener?.cancel();
   }
apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart (2)

240-270: Consider using pure async/await instead of mixing with .then().

The current pattern mixes await with .then() chaining, which is functional but not idiomatic. A cleaner approach would use pure async/await for better readability and error handling.

♻️ Suggested refactor
  Future<void> _loginWithGoogle(BuildContext context) async {
-   await GoogleAuthHelper.signIn(
+   final userCredential = await GoogleAuthHelper.signIn(
      context,
      onSuccess: () {
        if (context.mounted) {
          showAppSnackbar(context, context.t.sign_in_successful);
        }
      },
      onError: (error) {
        if (context.mounted) {
          showAppSnackbar(context, error.toString(), type: SnackbarType.failed);
        }
      },
-   ).then((userCredential) {
-     if (userCredential != null && context.mounted) {
-       final user = userCredential.user;
-       if (user != null) {
-         final requestModel = AuthRequestModel(
-           name: user.displayName,
-           email: user.email,
-           provider: 'google',
-           providerId: user.uid,
-           providerToken: user.uid,
-           oneSignalPlayerId: 'playerId if onesignal is integrated',
-         );
-
-         context.read<SignInBloc>().add(SignInWithGoogleTaped(requestModel: requestModel));
-       }
-     }
-   });
+   );
+   
+   if (userCredential != null && context.mounted) {
+     final user = userCredential.user;
+     if (user != null) {
+       final requestModel = AuthRequestModel(
+         name: user.displayName,
+         email: user.email,
+         provider: 'google',
+         providerId: user.uid,
+         providerToken: user.uid,
+         oneSignalPlayerId: 'playerId if onesignal is integrated',
+       );
+
+       context.read<SignInBloc>().add(SignInWithGoogleTaped(requestModel: requestModel));
+     }
+   }
  }

Also note: Line 263 contains a placeholder string 'playerId if onesignal is integrated' that should be addressed.


294-316: Consider making Apple sign-in consistent with Google sign-in.

The _loginWithApple method still uses the synchronous fire-and-forget pattern with .then(), while _loginWithGoogle was refactored to be async. For consistency across authentication methods, consider applying the same async pattern here.

♻️ Suggested refactor for consistency
- void _loginWithApple(BuildContext context) {
-   AppleAuthHelper.signIn(
+ Future<void> _loginWithApple(BuildContext context) async {
+   final requestModel = await AppleAuthHelper.signIn(
      context,
      onSuccess: () {
        if (context.mounted) {
          showAppSnackbar(context, context.t.sign_in_successful);
        }
      },
      onError: (error) {
        if (context.mounted) {
          if (error.code == AuthorizationErrorCode.canceled) {
            showAppSnackbar(context, context.t.operation_cancelled, type: SnackbarType.failed);
          } else {
            showAppSnackbar(context, error.message, type: SnackbarType.failed);
          }
        }
      },
-   ).then((requestModel) {
-     if (requestModel != null && context.mounted) {
-       context.read<SignInBloc>().add(SignInWithGoogleTaped(requestModel: requestModel));
-     }
-   });
+   );
+   
+   if (requestModel != null && context.mounted) {
+     context.read<SignInBloc>().add(SignInWithGoogleTaped(requestModel: requestModel));
+   }
  }
packages/widgetbook/lib/widgets/atoms/app_border_radius.dart (1)

42-54: Consider using design system constants for consistency.

The demo uses hardcoded values that could be aligned with coding guidelines:

  • Line 43: EdgeInsets.all(16.0) → consider Insets constants
  • Line 48: Colors.blue → consider context.colorScheme
  • Line 52: Raw Text widget with hardcoded Colors.white → consider AppText with theme colors

Since this is a widgetbook demo showcasing AppBorderRadius specifically, these may be intentional. Based on learnings, the project prefers Insets constants and context.colorScheme.

packages/widgetbook/lib/widgets/molecules/app_network_image.dart (1)

7-10: Update the use case name to reflect the new knob type.

The annotation name still references "(using list)" but the implementation now uses dropdown knobs.

Suggested fix
 @widgetbook.UseCase(
-  name: 'All-in-One Showcase with Knobs (using list)',
+  name: 'All-in-One Showcase with Knobs',
   type: AppNetworkImage,
 )
packages/widgetbook/lib/widgets/molecules/app_text_field.dart (1)

172-177: Add explicit type parameter for consistency.

The dropdown is missing an explicit type parameter. While Dart can infer String from minLinesOptions, adding the explicit type improves readability and consistency with other knob declarations in this file.

Suggested fix
-  final minLinesString = context.knobs.object.dropdown(
+  final minLinesString = context.knobs.object.dropdown<String>(
     label: 'Min Lines (for multiline)',
     options: minLinesOptions,
     initialOption: '3',
   );
packages/widgetbook/lib/widgets/molecules/app_bar.dart (1)

71-71: Consider using AppText for consistency.

The body uses a raw Text widget. Per coding guidelines, prefer AppText for consistent typography, even in widgetbook previews.

♻️ Suggested change
-    body: const Center(child: Text('AppBar Preview')),
+    body: const Center(child: AppText(text: 'AppBar Preview')),
apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart (1)

58-62: Consider adding a mounted check or cancellation for in-flight async operations.

Since listener() is now async, there's a potential (though currently minimal due to the synchronous nature of _checkIfCanLoadMore) for the callback to execute after dispose() is called. If you later make onEndScroll/onTopScroll truly async as suggested above, you should add a mounted check before any state mutations. Based on learnings, this aligns with the PR's pattern of adding mounted checks for state safety.

  Future<void> listener() async {
    if (scrollController.offset > scrollController.position.maxScrollExtent - 50) {
      await _checkIfCanLoadMore();
+     if (!mounted) return;
    }
  }
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b749ed9 and 4925c09.

📒 Files selected for processing (34)
  • .idea/runConfigurations/melos_run_analyze.xml
  • .idea/runConfigurations/melos_run_asset_gen.xml
  • .idea/runConfigurations/melos_run_build_apk.xml
  • .idea/runConfigurations/melos_run_build_bundle.xml
  • apps/app_core/lib/app/app.dart
  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
  • apps/app_core/lib/app/helpers/permission/permission_helper.dart
  • apps/app_core/lib/core/data/services/connectivity_service.dart
  • apps/app_core/lib/core/data/services/network_helper.service.dart
  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
  • apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
  • apps/app_core/pubspec.yaml
  • melos.yaml
  • packages/api_client/lib/src/api_tokens_interceptor.dart
  • packages/app_subscription/pubspec.yaml
  • packages/widgetbook/lib/main.dart
  • packages/widgetbook/lib/widgets/animation/slide_and_fade_animation_wrapper.dart
  • packages/widgetbook/lib/widgets/atoms/app_border_radius.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/atoms/spacing.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • packages/widgetbook/lib/widgets/organisms/app_scaffold.dart
  • pubspec.yaml
  • scripts/mason-lock.json
  • scripts/mason.yaml
💤 Files with no reviewable changes (1)
  • melos.yaml
✅ Files skipped from review due to trivial changes (2)
  • scripts/mason.yaml
  • scripts/mason-lock.json
🚧 Files skipped from review as they are similar to previous changes (6)
  • .idea/runConfigurations/melos_run_analyze.xml
  • apps/app_core/lib/core/presentation/widgets/force_update_widget.dart
  • apps/app_core/lib/app/app.dart
  • .idea/runConfigurations/melos_run_asset_gen.xml
  • pubspec.yaml
  • packages/app_subscription/pubspec.yaml
🧰 Additional context used
📓 Path-based instructions (3)
**/*.dart

📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)

**/*.dart: Use generated Assets class from flutter_gen for asset access instead of raw string paths like Image.asset("assets/...")
For PNG/JPG images in assets, use the .image() method from generated Assets class (e.g., Assets.images.demo.image())
For SVG assets in assets, use the .svg() method from generated Assets class (e.g., Assets.icons.home.svg())
Use .path property from generated Assets class when raw asset path strings are needed (e.g., Assets.images.demo.path)
Use .provider() method from generated Assets class when ImageProvider is needed for widgets like CircleAvatar or precacheImage

**/*.dart: Use context.t for accessing translations instead of hardcoded strings in Flutter widgets
Use VSpace and HSpace components for spacing instead of raw SizedBox widgets
Use AppButton component instead of raw Material buttons like ElevatedButton or TextButton
Use predefined AppText components (AppText.small(), AppText.medium(), AppText.large()) for text rendering
Use AppBorderRadius constants (small, medium, large) instead of raw border radius values
Use Insets constants for padding and margins instead of raw EdgeInsets values
Use AppLoadingIndicator component for showing loading states
Use AppButton with isExpanded: true for full-width buttons and isEnabled property for controlling button state
Use AppButton variants (secondary, outline, text, destructive) for different button styles instead of creating custom button implementations
Use AppCard component for card-based layouts instead of raw Card or Container widgets
Use AppTextField component for text input fields instead of raw Material TextField widgets

**/*.dart: Use context.colorScheme to access colors instead of hardcoded color values, following Material Design conventions
Use AppText widget instead of Text widget to utilize consistent typography
Use context.textTheme to access text styles instead of defining custom styles

...

Files:

  • apps/app_core/lib/core/data/services/connectivity_service.dart
  • packages/api_client/lib/src/api_tokens_interceptor.dart
  • packages/widgetbook/lib/main.dart
  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/organisms/app_scaffold.dart
  • apps/app_core/lib/core/data/services/network_helper.service.dart
  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • packages/widgetbook/lib/widgets/animation/slide_and_fade_animation_wrapper.dart
  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • apps/app_core/lib/app/helpers/permission/permission_helper.dart
  • packages/widgetbook/lib/widgets/atoms/spacing.dart
  • packages/widgetbook/lib/widgets/atoms/app_border_radius.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
  • apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart
**/*screen.dart

📄 CodeRabbit inference engine (.cursor/rules/auto-route.mdc)

**/*screen.dart: Annotate screen widgets with @RoutePage() decorator directly above the class declaration for Auto Route navigation
For simple screens without state management, implement screen widgets as StatelessWidget with @RoutePage() annotation
For screens requiring state management with BLoC/Cubit, extend StatefulWidget and implement AutoRouteWrapper interface with MultiRepositoryProvider and MultiBlocProvider setup
Use BackButtonListener instead of PopScope in Flutter Auto Route projects to avoid conflicts
When using BLoC in screens, implement AutoRouteWrapper interface and initialize BLoCs with lazy: false in MultiBlocProvider for immediate initialization when appropriate
Return this as the child widget in AutoRouteWrapper's wrappedRoute method after setting up MultiRepositoryProvider and MultiBlocProvider

Files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
  • apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart
**/*_screen.dart

📄 CodeRabbit inference engine (.cursor/rules/bloc.mdc)

**/*_screen.dart: Implement AutoRouteWrapper in screen classes for scoped provider injection
Use RepositoryProvider to provide repository instances in screen wrappedRoute method
Use BlocProvider with lazy: false for immediate BLoC initialization and add initial events in screen wrappedRoute

To coordinate between blocs, use BlocListener in the presentation layer to listen to one bloc and add events to another

Files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
  • apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart
🧠 Learnings (39)
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization

Applied to files:

  • apps/app_core/lib/core/data/services/connectivity_service.dart
  • apps/app_core/lib/core/data/services/network_helper.service.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*.dart : Use `Future<void>` as the return type of asynchronous members that do not produce values

Applied to files:

  • apps/app_core/lib/core/data/services/connectivity_service.dart
  • apps/app_core/lib/core/data/services/network_helper.service.dart
  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
  • apps/app_core/lib/app/helpers/permission/permission_helper.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `Insets` constants for padding and margins instead of raw `EdgeInsets` values

Applied to files:

  • packages/widgetbook/lib/main.dart
  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • packages/widgetbook/lib/widgets/atoms/spacing.dart
  • packages/widgetbook/lib/widgets/atoms/app_border_radius.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Keep build methods simple and focused

Applied to files:

  • packages/widgetbook/lib/main.dart
  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
📚 Learning: 2026-01-08T09:01:21.169Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/color.mdc:0-0
Timestamp: 2026-01-08T09:01:21.169Z
Learning: Applies to **/*.dart : Use AppText widget instead of Text widget to utilize consistent typography

Applied to files:

  • packages/widgetbook/lib/main.dart
  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • packages/widgetbook/lib/widgets/atoms/app_border_radius.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Use the Flutter Inspector and review widget constraints to debug layout issues

Applied to files:

  • packages/widgetbook/lib/main.dart
  • packages/widgetbook/lib/widgets/atoms/spacing.dart
  • apps/app_core/pubspec.yaml
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Extract reusable widgets into separate components

Applied to files:

  • packages/widgetbook/lib/main.dart
  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • packages/widgetbook/lib/widgets/animation/slide_and_fade_animation_wrapper.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • packages/widgetbook/lib/widgets/atoms/spacing.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppTextField` component for text input fields instead of raw Material `TextField` widgets

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Keep state as local as possible

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/organisms/app_scaffold.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • packages/widgetbook/lib/widgets/atoms/spacing.dart
  • packages/widgetbook/lib/widgets/atoms/app_border_radius.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : If you get 'An InputDecorator...cannot have an unbounded width', constrain the width of widgets like `TextField`

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
📚 Learning: 2026-01-08T09:01:21.169Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/color.mdc:0-0
Timestamp: 2026-01-08T09:01:21.169Z
Learning: Applies to **/*.dart : Use context.textTheme to access text styles instead of defining custom styles

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Use `const` constructors when possible

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/organisms/app_scaffold.dart
  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `context.t` for accessing translations instead of hardcoded strings in Flutter widgets

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_text_field.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppButton` variants (`secondary`, `outline`, `text`, `destructive`) for different button styles instead of creating custom button implementations

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
  • packages/widgetbook/lib/widgets/atoms/app_border_radius.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppButton` component instead of raw Material buttons like `ElevatedButton` or `TextButton`

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • packages/widgetbook/lib/widgets/molecules/app_dropdown.dart
  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/atoms/app_text.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppButton` with `isExpanded: true` for full-width buttons and `isEnabled` property for controlling button state

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_button.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
  • apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppCard` component for card-based layouts instead of raw `Card` or `Container` widgets

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_button.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppBorderRadius` constants (`small`, `medium`, `large`) instead of raw border radius values

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
  • packages/widgetbook/lib/widgets/atoms/app_border_radius.dart
📚 Learning: 2026-01-08T09:01:21.169Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/color.mdc:0-0
Timestamp: 2026-01-08T09:01:21.169Z
Learning: Applies to **/*.dart : Use context.colorScheme to access colors instead of hardcoded color values, following Material Design conventions

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
  • packages/widgetbook/lib/widgets/organisms/app_scaffold.dart
  • packages/widgetbook/lib/widgets/molecules/app_bar.dart
  • packages/widgetbook/lib/widgets/molecules/app_network_image.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*.dart : Use setters for operations that conceptually change properties

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `VSpace` and `HSpace` components for spacing instead of raw `SizedBox` widgets

Applied to files:

  • packages/widgetbook/lib/widgets/atoms/padding.dart
  • packages/widgetbook/lib/widgets/atoms/spacing.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : For simple screens without state management, implement screen widgets as StatelessWidget with RoutePage() annotation

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_screen.dart : Use BlocProvider with lazy: false for immediate BLoC initialization and add initial events in screen wrappedRoute

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:02:42.105Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/structure.mdc:0-0
Timestamp: 2026-01-08T09:02:42.105Z
Learning: Applies to lib/modules/**/screen/*.dart : Screen files must follow naming pattern `[feature]_screen.dart`

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • apps/app_core/lib/modules/change_password/screen/change_password_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Annotate screen widgets with `RoutePage()` decorator directly above the class declaration for Auto Route navigation

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_screen.dart : Implement AutoRouteWrapper in screen classes for scoped provider injection

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : When using BLoC in screens, implement AutoRouteWrapper interface and initialize BLoCs with lazy: false in MultiBlocProvider for immediate initialization when appropriate

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Use BackButtonListener instead of PopScope in Flutter Auto Route projects to avoid conflicts

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/app_router.dart : In app_router.dart, use AutoRouterConfig(replaceInRouteName: 'Page|Screen,Route') annotation and define routes in the routes list using AutoRoute configuration

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Return `this` as the child widget in AutoRouteWrapper's wrappedRoute method after setting up MultiRepositoryProvider and MultiBlocProvider

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : For screens requiring state management with BLoC/Cubit, extend StatefulWidget and implement AutoRouteWrapper interface with MultiRepositoryProvider and MultiBlocProvider setup

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper pagination tracking in BLoC event handlers to manage data fetching

Applied to files:

  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement pagination logic at BLoC level with proper tracking to avoid memory issues

Applied to files:

  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Implement pagination for large lists

Applied to files:

  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Show loading state only on initial load, not on subsequent data fetches in pagination scenarios

Applied to files:

  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_screen.dart : To coordinate between blocs, use BlocListener in the presentation layer to listen to one bloc and add events to another

Applied to files:

  • apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use predefined `AppText` components (`AppText.small()`, `AppText.medium()`, `AppText.large()`) for text rendering

Applied to files:

  • packages/widgetbook/lib/widgets/atoms/app_text.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Use `StatelessWidget` when possible

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Avoid unnecessary `StatefulWidget`s

Applied to files:

  • packages/widgetbook/lib/widgets/molecules/empty_screen.dart
🔇 Additional comments (37)
.idea/runConfigurations/melos_run_build_apk.xml (1)

9-9: LGTM!

Enabling EXECUTE_IN_TERMINAL for the build-apk command is appropriate—it allows developers to see real-time build output and interact with the terminal if needed. This aligns with the broader update to other Melos run configurations in this PR.

.idea/runConfigurations/melos_run_build_bundle.xml (1)

9-9: LGTM!

Consistent with the build-apk configuration update. Terminal execution is beneficial for build commands that produce significant output.

packages/widgetbook/lib/main.dart (1)

34-46: LGTM!

The appBuilder configuration correctly uses context.colorScheme.grey300 for the background color, following the coding guidelines for accessing colors via the color scheme instead of hardcoded values.

apps/app_core/lib/core/presentation/screens/webview_screen.dart (1)

34-49: Good use of unawaited with mounted guard for async initialization.

The pattern of wrapping async calls in unawaited() within initState and checking mounted before setState is correct for safe lifecycle handling.

packages/api_client/lib/src/api_tokens_interceptor.dart (1)

241-241: LGTM!

The change from (_, __) to (_, _) is valid Dart 3+ syntax. Wildcard patterns (_) don't create bindings, so multiple uses in the same parameter list are permitted. This is a clean, idiomatic way to ignore both the error and stack trace parameters.

apps/app_core/lib/core/data/services/network_helper.service.dart (1)

22-24: Good change: async disposal pattern correctly implemented.

The change to Future<void> dispose() async with await listener.cancel() follows best practices for asynchronous disposal of stream subscriptions. This aligns with the coding guidelines for using Future<void> as the return type for async members that don't produce values.

apps/app_core/lib/core/data/services/connectivity_service.dart (1)

64-67: Good change: async disposal pattern correctly implemented.

The change to Future<void> dispose() async with await _controller.close() follows best practices. The cleanup order (removing overlay first, then closing controller) is appropriate.

apps/app_core/lib/modules/change_password/screen/change_password_screen.dart (1)

127-130: LGTM!

The async/await pattern is correctly implemented. The context is accessed synchronously to obtain the cubit reference before awaiting, and there's no widget interaction after the await completes, making this a safe pattern that doesn't require a mounted check.

apps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dart (2)

68-71: LGTM!

The async navigation pattern is acceptable. While awaiting pushRoute isn't strictly necessary when no subsequent code depends on navigation completion, it doesn't introduce any issues and can be useful for future extensibility.


206-217: LGTM!

The async pattern for the sign-up navigation is consistent with the forgot password handler. The widget correctly uses AppButton with isExpanded: true as per coding guidelines.

packages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dart (3)

17-28: LGTM! Knob migration to dropdown is consistent.

The migration from knobs.list<String> to knobs.object.dropdown<String> for the Color knob is correctly implemented with preserved options and initialOption.


58-69: LGTM! Size knob migration is correct.

The dropdown knob migration maintains the same options and initial value for size selection.


107-116: LGTM! Layout knob migration completed.

The Layout Example knob is correctly migrated to use the dropdown object API.

packages/widgetbook/lib/widgets/animation/slide_and_fade_animation_wrapper.dart (1)

14-18: LGTM! Enum-based dropdown knob migration.

The migration correctly uses SlideFrom.values as options with the dropdown API, maintaining type safety for the enum selection.

packages/widgetbook/lib/widgets/molecules/app_dropdown.dart (2)

45-55: LGTM! Category items dropdown migration.

The migration preserves the category selection behavior with the dropdown API.


118-122: LGTM! Index selection dropdown migration.

The string-based index dropdown works correctly with the existing int.tryParse handling at line 124.

packages/widgetbook/lib/widgets/molecules/app_button.dart (3)

17-21: LGTM! ButtonType enum dropdown migration.

The migration correctly uses ButtonType.values with the dropdown API for type-safe button type selection.


62-73: LGTM! IconData dropdown migration.

The icon selection dropdown is correctly migrated with the list of icon options preserved.


75-79: LGTM! Container type dropdown migration.

The string-based container type selection is correctly migrated to use the dropdown API.

packages/widgetbook/lib/widgets/molecules/empty_screen.dart (2)

63-73: LGTM! Icon type dropdown migration.

The icon type selection is correctly migrated to use the dropdown API with all options preserved.


125-135: LGTM! Layout type dropdown migration.

The layout type dropdown migration is complete and consistent with the switch statement handling at line 138.

packages/widgetbook/lib/widgets/atoms/app_border_radius.dart (1)

11-37: LGTM! Knob migration to dropdown is correct.

The migration from knobs.list<double> to knobs.object.dropdown<double> preserves all options, initial value, and label builder logic.

packages/widgetbook/lib/widgets/organisms/app_scaffold.dart (1)

16-21: LGTM! Color knob migration is correct.

The dropdown migration preserves the color options and label builder. The labelBuilder: (color) => color.toString() correctly renders color identifiers for the dropdown.

packages/widgetbook/lib/widgets/molecules/app_network_image.dart (2)

27-40: LGTM! Media Type and Shape knob migrations are correct.

Both migrations properly handle:

  • Nullable String? with appropriate null-coalescing in the label builder
  • Enum type BoxShape with descriptive labels

72-89: LGTM! Placeholder Color knob migration is correct.

The color dropdown maintains all options with a comprehensive label builder mapping each color to a human-readable name.

packages/widgetbook/lib/widgets/molecules/app_text_field.dart (2)

23-34: LGTM! Input Type knob migration is correct.

The dropdown preserves the input type options with proper const modifier on the options list.


71-81: LGTM! Content Padding Type knob migration is correct.

The dropdown maintains all padding type options with const optimization.

packages/widgetbook/lib/widgets/atoms/spacing.dart (2)

11-35: LGTM! VSpace knob migration uses Insets constants correctly.

The dropdown properly uses design system constants (Insets.xxsmall4, etc.) which aligns with coding guidelines.

Note: No initialOption is specified, so the dropdown defaults to the first option (Insets.xxsmall4). If Insets.medium16 was the previous default, consider adding initialOption: Insets.medium16 to maintain the same behavior.


54-74: LGTM! HSpace knob migration is correct.

Same observation as VSpace: no initialOption specified, defaulting to Insets.xxsmall4. Verify this is the intended default spacing for the demo.

packages/widgetbook/lib/widgets/atoms/padding.dart (1)

10-10: LGTM on the knob migration.

The migration from knobs.list<double> to knobs.object.dropdown<double> is correct and aligns with the widgetbook 3.x API.

packages/widgetbook/lib/widgets/molecules/app_bar.dart (1)

13-31: LGTM on the knob migrations.

Both titleColor and backgroundColor knob migrations from knobs.list<Color> to knobs.object.dropdown<Color> are correctly implemented. The dropdown provides a cleaner single-select UI for color selection.

packages/widgetbook/lib/widgets/atoms/app_text.dart (2)

10-40: LGTM on the AppTextLevel dropdown migration.

The migration correctly uses knobs.object.dropdown<AppTextLevel> with an exhaustive switch in the labelBuilder. The initialOption is properly preserved.


44-63: LGTM on the TextAlign dropdown migration.

The migration to knobs.object.dropdown<TextAlign> is correct. The labelBuilder handles all TextAlign values appropriately.

apps/app_core/lib/app/helpers/permission/permission_helper.dart (1)

18-20: Good improvement making this method async.

The change correctly follows the guideline to use Future<void> for asynchronous members. Note that openAppSettings() returns a Future<bool> indicating success/failure, which is now discarded. Consider returning the result if callers need to handle failure cases.

apps/app_core/pubspec.yaml (3)

12-12: LGTM! Workspace configuration is correctly set up.

The resolution: workspace directive and workspace package references without versions are appropriate for a Dart/Flutter monorepo using the workspace feature introduced in Dart 3.x.

Also applies to: 22-27


30-30: LGTM! Minor and patch version updates look appropriate.

The remaining dependency updates are minor/patch version bumps that should be backward-compatible. Good practice to keep dependencies current.

Also applies to: 36-37, 40-40, 43-43, 47-47, 52-52, 55-55, 59-60, 64-65, 84-84, 91-91, 94-94, 99-100, 103-103, 106-106, 112-112


107-107: No lint configuration conflicts detected with very_good_analysis v10.0.0 upgrade.

The major version jump (7.x → 10.x) does remove some rules (e.g., require_trailing_commas in v8.0.0, diagnostic_describe_all_properties in v10.0.0), but the codebase is safe. The apps/app_core/analysis_options.yaml includes package:very_good_analysis/analysis_options.yaml directly, delegating rule selection to the package. The custom rules section does not explicitly configure any removed rules, so the upgrade should proceed without lint errors.

Comment on lines +27 to 31
Future<void> listener() async {
if (scrollController.offset > scrollController.position.maxScrollExtent - 50) {
_checkIfCanLoadMore();
await _checkIfCanLoadMore();
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Async conversion is ineffective in this context.

Two issues with this change:

  1. ScrollController.addListener() expects a VoidCallback, so the returned Future<void> is ignored by the scroll controller.
  2. _checkIfCanLoadMore() contains no await statements—it calls synchronous onEndScroll()/onTopScroll() and resets the guard flags immediately, so the await on line 29 completes synchronously.

The guard flags (_canFetchBottom, _canFetchTop) are reset immediately after calling the handlers, which means they don't prevent duplicate fetch requests during actual async operations triggered by implementers.

If the intent is to prevent multiple simultaneous load-more requests, consider:

  • Making onEndScroll() return Future<void> and awaiting it before resetting the flag
  • Or exposing a method for implementers to signal completion
Suggested pattern for actual async guard protection
-  void onEndScroll();
+  Future<void> onEndScroll();

-  void onTopScroll() {}
+  Future<void> onTopScroll() async {}

   Future<void> _checkIfCanLoadMore() async {
     if (scrollController.position.pixels == 0) {
       if (!_canFetchTop) return;
       _canFetchTop = false;
-      onTopScroll();
+      await onTopScroll();
       _canFetchTop = true;
     } else {
       if (!_canFetchBottom) return;
       _canFetchBottom = false;
-      onEndScroll();
+      await onEndScroll();
       _canFetchBottom = true;
     }
   }
🤖 Prompt for AI Agents
In @apps/app_core/lib/app/helpers/mixins/pagination_mixin.dart around lines 27 -
31, The listener being async is ineffective because ScrollController.addListener
expects a VoidCallback and any Future is ignored; fix by making
onEndScroll/onTopScroll return Future<void>, update _checkIfCanLoadMore() to be
async and await those handlers before resetting the guards
(_canFetchBottom/_canFetchTop) so the flags actually prevent concurrent loads,
and change listener() to a synchronous VoidCallback that simply calls
_checkIfCanLoadMore() (fire-and-forget) or alternatively expose a completion
method for implementers to call when their async work finishes; update
references to listener(), _checkIfCanLoadMore(), onEndScroll(), onTopScroll(),
and the guard flags accordingly.

permission_handler: ^12.0.1
device_info_plus: ^11.3.3
image_cropper: ^9.0.0
image_cropper: ^11.0.0
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

image_cropper flutter 11.0.0 migration guide breaking changes

💡 Result:

Summary of breaking changes in image_cropper 11.0.0

  • iOS: upgraded TOCropViewController to v2.8.0 — plugin now requires iOS deployment target >= 12.0 (breaking). [1]
  • Flutter SDK: package constrains minimum Flutter to 3.28 (breaking) due to the image_cropper_platform_interface change. [1]

Recommended migration steps

  1. Bump your app's Flutter SDK constraint to >=3.28 in pubspec.yaml (or upgrade your Flutter SDK). [1]
  2. Raise iOS deployment target to 12.0:
    • In ios/Podfile set platform :ios, '12.0' and run pod install (or pod install --repo-update if pods conflict).
    • If you use Xcode, also update the project's Deployment Target to iOS 12.0.
      This resolves TOCropViewController compatibility after the plugin upgrade. [1][2]
  3. If CocoaPods reports TOCropViewController version conflicts, run:
    • pod repo update
    • pod update TOCropViewController
    • then pod install. This addresses dependency mismatches caused by the TOCropViewController bump. [2]
  4. Rebuild the app (flutter clean && flutter pub get && flutter build ...) and test iOS flows.

Sources
[1] image_cropper changelog (11.0.0). [pub.dev changelog].
[2] Related GitHub issue re: TOCropViewController version conflicts.


Address breaking changes for image_cropper 11.0.0 upgrade (9.x → 11.x):

This major version bump requires:

  • iOS deployment target must be ≥ 12.0 (update ios/Podfile and Xcode project settings)
  • Flutter SDK constraint must be ≥ 3.28 in pubspec.yaml

Verify these requirements are met before proceeding, and run flutter clean && flutter pub get after updating dependencies.

🤖 Prompt for AI Agents
In @apps/app_core/pubspec.yaml at line 62, You upgraded image_cropper to 11.0.0
but haven’t applied required platform/version changes: update the Flutter SDK
constraint in pubspec.yaml to at least 3.28 (adjust the sdk: "">=3.28.0 <4.0.0""
entry), raise the iOS deployment target to ≥12.0 in ios/Podfile (platform :ios,
'12.0') and in the Xcode project settings (iOS Deployment Target), then run
flutter clean && flutter pub get to refresh dependencies and ensure build
settings are consistent with the new image_cropper version.

- Fixed the loading logic in `WebViewScreen` by initializing `_isLoading` to `true` and correcting the conditional rendering to show the `WebViewWidget` when loading is complete.
- Refactored `_WebViewScreenState` for better initialization and concise state updates.
- Updated `envied_generator` from `^1.1.1` to `^1.3.2` in `pubspec.yaml`.
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/app_core/pubspec.yaml (1)

30-84: Firebase packages require Flutter 3.16+ and Dart 3.2+, incompatible with Flutter 3.7.2.

firebase_auth 5.5.1, firebase_core 3.12.1, and firebase_crashlytics 4.3.5 require Dart >=3.2.0 and Flutter >=3.16.0. Flutter 3.7.2 ships with Dart 2.19.x, creating a blocking incompatibility. Either upgrade Flutter to 3.16 or later, or use Firebase plugin versions compatible with Dart 2.19.

🤖 Fix all issues with AI agents
In @apps/app_core/lib/core/presentation/screens/webview_screen.dart:
- Around line 44-46: The code calls
webViewController.loadRequest(Uri.parse(widget.url ?? '')) which parses an empty
string when widget.url is null and can load a blank page; instead validate
widget.url (check for null/empty and that Uri.tryParse(widget.url) yields a
valid absolute URI) before calling webViewController.loadRequest, and if the URL
is invalid show an error/placeholder state (or skip loading) in the
WebViewScreen widget so you never call loadRequest with an empty/invalid URI.
🧹 Nitpick comments (3)
apps/app_core/lib/core/presentation/screens/webview_screen.dart (1)

26-26: Redundant late modifier.

Since webViewController is initialized at declaration, late is unnecessary. Consider using final instead.

♻️ Suggested fix
-  late WebViewController webViewController = WebViewController();
+  final WebViewController webViewController = WebViewController();
apps/app_core/pubspec.yaml (2)

69-69: Remove commented-out code.

This commented firebase_crashlytics entry is redundant since the package is already declared on line 74 with version ^4.3.5.

🧹 Proposed cleanup
   # For Firebase
-  #  firebase_crashlytics: ^4.1.0
   firebase_core: ^3.12.1

91-91: Redundant lint packages.

Both flutter_lints and very_good_analysis are included. Since very_good_analysis provides a more comprehensive and stricter ruleset that encompasses flutter_lints, you can remove flutter_lints to avoid potential conflicts and simplify the configuration.

♻️ Proposed fix
 dev_dependencies:
   flutter_test:
     sdk: flutter

-  flutter_lints: ^6.0.0
-
   # For generating code
   build_runner: ^2.10.4

Also applies to: 107-107

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4925c09 and aee32b7.

📒 Files selected for processing (2)
  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
  • apps/app_core/pubspec.yaml
🧰 Additional context used
📓 Path-based instructions (3)
**/*.dart

📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)

**/*.dart: Use generated Assets class from flutter_gen for asset access instead of raw string paths like Image.asset("assets/...")
For PNG/JPG images in assets, use the .image() method from generated Assets class (e.g., Assets.images.demo.image())
For SVG assets in assets, use the .svg() method from generated Assets class (e.g., Assets.icons.home.svg())
Use .path property from generated Assets class when raw asset path strings are needed (e.g., Assets.images.demo.path)
Use .provider() method from generated Assets class when ImageProvider is needed for widgets like CircleAvatar or precacheImage

**/*.dart: Use context.t for accessing translations instead of hardcoded strings in Flutter widgets
Use VSpace and HSpace components for spacing instead of raw SizedBox widgets
Use AppButton component instead of raw Material buttons like ElevatedButton or TextButton
Use predefined AppText components (AppText.small(), AppText.medium(), AppText.large()) for text rendering
Use AppBorderRadius constants (small, medium, large) instead of raw border radius values
Use Insets constants for padding and margins instead of raw EdgeInsets values
Use AppLoadingIndicator component for showing loading states
Use AppButton with isExpanded: true for full-width buttons and isEnabled property for controlling button state
Use AppButton variants (secondary, outline, text, destructive) for different button styles instead of creating custom button implementations
Use AppCard component for card-based layouts instead of raw Card or Container widgets
Use AppTextField component for text input fields instead of raw Material TextField widgets

**/*.dart: Use context.colorScheme to access colors instead of hardcoded color values, following Material Design conventions
Use AppText widget instead of Text widget to utilize consistent typography
Use context.textTheme to access text styles instead of defining custom styles

...

Files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
**/*screen.dart

📄 CodeRabbit inference engine (.cursor/rules/auto-route.mdc)

**/*screen.dart: Annotate screen widgets with @RoutePage() decorator directly above the class declaration for Auto Route navigation
For simple screens without state management, implement screen widgets as StatelessWidget with @RoutePage() annotation
For screens requiring state management with BLoC/Cubit, extend StatefulWidget and implement AutoRouteWrapper interface with MultiRepositoryProvider and MultiBlocProvider setup
Use BackButtonListener instead of PopScope in Flutter Auto Route projects to avoid conflicts
When using BLoC in screens, implement AutoRouteWrapper interface and initialize BLoCs with lazy: false in MultiBlocProvider for immediate initialization when appropriate
Return this as the child widget in AutoRouteWrapper's wrappedRoute method after setting up MultiRepositoryProvider and MultiBlocProvider

Files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
**/*_screen.dart

📄 CodeRabbit inference engine (.cursor/rules/bloc.mdc)

**/*_screen.dart: Implement AutoRouteWrapper in screen classes for scoped provider injection
Use RepositoryProvider to provide repository instances in screen wrappedRoute method
Use BlocProvider with lazy: false for immediate BLoC initialization and add initial events in screen wrappedRoute

To coordinate between blocs, use BlocListener in the presentation layer to listen to one bloc and add events to another

Files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
🧠 Learnings (17)
📚 Learning: 2026-01-08T09:02:42.105Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/structure.mdc:0-0
Timestamp: 2026-01-08T09:02:42.105Z
Learning: Applies to lib/modules/**/screen/*.dart : Screen files must follow naming pattern `[feature]_screen.dart`

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : For simple screens without state management, implement screen widgets as StatelessWidget with RoutePage() annotation

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_screen.dart : Use BlocProvider with lazy: false for immediate BLoC initialization and add initial events in screen wrappedRoute

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Annotate screen widgets with `RoutePage()` decorator directly above the class declaration for Auto Route navigation

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Keep build methods simple and focused

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Use BackButtonListener instead of PopScope in Flutter Auto Route projects to avoid conflicts

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_screen.dart : Implement AutoRouteWrapper in screen classes for scoped provider injection

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppLoadingIndicator` component for showing loading states

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Extract reusable widgets into separate components

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/app_router.dart : In app_router.dart, use AutoRouterConfig(replaceInRouteName: 'Page|Screen,Route') annotation and define routes in the routes list using AutoRoute configuration

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : Return `this` as the child widget in AutoRouteWrapper's wrappedRoute method after setting up MultiRepositoryProvider and MultiBlocProvider

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : For screens requiring state management with BLoC/Cubit, extend StatefulWidget and implement AutoRouteWrapper interface with MultiRepositoryProvider and MultiBlocProvider setup

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:48.789Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/auto-route.mdc:0-0
Timestamp: 2026-01-08T09:00:48.789Z
Learning: Applies to **/*screen.dart : When using BLoC in screens, implement AutoRouteWrapper interface and initialize BLoCs with lazy: false in MultiBlocProvider for immediate initialization when appropriate

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:00:38.229Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/atomic-design-rule.mdc:0-0
Timestamp: 2026-01-08T09:00:38.229Z
Learning: Applies to **/*.dart : Use `AppButton` component instead of raw Material buttons like `ElevatedButton` or `TextButton`

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Show loading state only on initial load, not on subsequent data fetches in pagination scenarios

Applied to files:

  • apps/app_core/lib/core/presentation/screens/webview_screen.dart
📚 Learning: 2026-01-08T09:01:17.438Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/bloc.mdc:0-0
Timestamp: 2026-01-08T09:01:17.438Z
Learning: Applies to **/*_bloc.dart : Implement proper disposal and stream subscription management in BLoC for memory optimization

Applied to files:

  • apps/app_core/pubspec.yaml
📚 Learning: 2026-01-08T09:02:10.763Z
Learnt from: CR
Repo: 7span/dashing-kit PR: 0
File: .cursor/rules/flutter-dart.mdc:0-0
Timestamp: 2026-01-08T09:02:10.763Z
Learning: Applies to **/*_widget.dart : Use the Flutter Inspector and review widget constraints to debug layout issues

Applied to files:

  • apps/app_core/pubspec.yaml
🔇 Additional comments (3)
apps/app_core/lib/core/presentation/screens/webview_screen.dart (2)

1-23: LGTM!

The dart:async import is correctly added for unawaited, and the screen class follows coding guidelines with proper @RoutePage() annotation and @QueryParam() decorators.


51-63: LGTM!

Build method follows coding guidelines correctly: uses context.colorScheme for colors and AppCircularProgressIndicator for the loading state. The conditional rendering logic is clean and straightforward.

apps/app_core/pubspec.yaml (1)

12-12: Workspace configuration is correctly set up.

The resolution: workspace directive and version-less workspace package references are appropriate for Dart's workspace/monorepo support. The root pubspec.yaml properly defines the workspace and lists all member packages.

@pratik-7span pratik-7span merged commit 83397f3 into main Jan 12, 2026
1 check passed
Copy link
Contributor

@pratik-7span pratik-7span left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes approved

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants