-
Notifications
You must be signed in to change notification settings - Fork 7
Update packages #61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update packages #61
Conversation
- 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`.
📝 WalkthroughWalkthroughBumps Android/Gradle toolchain and many Dart/Flutter dependency versions, adds workspace/melos config, converts several synchronous dispose/listener/helpers/navigation methods to async Changes
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ 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. Comment |
There was a problem hiding this 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_apple7.x is safe. The code usesSignInWithApple.getAppleIDCredential()directly (notSignInWithAppleButton), so theonPressednullability change is not applicable. Error handling insign_in_screen.dart(line 304) checks forAuthorizationErrorCode.canceledexplicitly with a fallback else clause. While newAuthorizationErrorCodeenum 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
📒 Files selected for processing (10)
apps/app_core/android/app/build.gradle.ktsapps/app_core/android/gradle/wrapper/gradle-wrapper.propertiesapps/app_core/android/settings.gradle.ktsapps/app_core/pubspec.yamlpackages/api_client/pubspec.yamlpackages/app_notification_service/lib/src/onesignal_service.dartpackages/app_notification_service/pubspec.yamlpackages/app_subscription/pubspec.yamlpackages/app_translations/pubspec.yamlpackages/app_ui/pubspec.yaml
🧰 Additional context used
📓 Path-based instructions (1)
**/*.dart
📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)
**/*.dart: Use generatedAssetsclass fromflutter_genfor asset access instead of raw string paths likeImage.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.pathproperty 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: Usecontext.tfor accessing translations instead of hardcoded strings in Flutter widgets
UseVSpaceandHSpacecomponents for spacing instead of rawSizedBoxwidgets
UseAppButtoncomponent instead of raw Material buttons likeElevatedButtonorTextButton
Use predefinedAppTextcomponents (AppText.small(),AppText.medium(),AppText.large()) for text rendering
UseAppBorderRadiusconstants (small,medium,large) instead of raw border radius values
UseInsetsconstants for padding and margins instead of rawEdgeInsetsvalues
UseAppLoadingIndicatorcomponent for showing loading states
UseAppButtonwithisExpanded: truefor full-width buttons andisEnabledproperty for controlling button state
UseAppButtonvariants (secondary,outline,text,destructive) for different button styles instead of creating custom button implementations
UseAppCardcomponent for card-based layouts instead of rawCardorContainerwidgets
UseAppTextFieldcomponent for text input fields instead of raw MaterialTextFieldwidgets
**/*.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)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:
packages/app_ui/pubspec.yaml (2)
27-35: LGTM on dev dependency updates.The updates to
flutter_lints,build_runner,flutter_gen, andflutter_gen_runnerare 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 likehintLocales,showErrorWhenFocused, andonTapUpOutside), and the existingPinputwidget usage inpackages/app_ui/lib/src/widgets/molecules/app_otp_input.dart(usinglengthandseparatorBuilderparameters) 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_flutterpatch update and linting tool upgrades are reasonable. Note thatvery_good_analysisjumps 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 usingflutter.minSdkVersion.Using
flutter.minSdkVersioninstead 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, andurl_launcherare 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
registerSingletonandregisterLazySingletonpatterns with instance names inbootstrap.dart, and simplegetIt.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 integratingimage_cropper11.0.0.
image_cropper11.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.
…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.
There was a problem hiding this 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
📒 Files selected for processing (3)
apps/app_core/lib/app/app.dartpackages/app_notification_service/lib/src/notification_interface.dartpubspec.yaml
🧰 Additional context used
📓 Path-based instructions (1)
**/*.dart
📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)
**/*.dart: Use generatedAssetsclass fromflutter_genfor asset access instead of raw string paths likeImage.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.pathproperty 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: Usecontext.tfor accessing translations instead of hardcoded strings in Flutter widgets
UseVSpaceandHSpacecomponents for spacing instead of rawSizedBoxwidgets
UseAppButtoncomponent instead of raw Material buttons likeElevatedButtonorTextButton
Use predefinedAppTextcomponents (AppText.small(),AppText.medium(),AppText.large()) for text rendering
UseAppBorderRadiusconstants (small,medium,large) instead of raw border radius values
UseInsetsconstants for padding and margins instead of rawEdgeInsetsvalues
UseAppLoadingIndicatorcomponent for showing loading states
UseAppButtonwithisExpanded: truefor full-width buttons andisEnabledproperty for controlling button state
UseAppButtonvariants (secondary,outline,text,destructive) for different button styles instead of creating custom button implementations
UseAppCardcomponent for card-based layouts instead of rawCardorContainerwidgets
UseAppTextFieldcomponent for text input fields instead of raw MaterialTextFieldwidgets
**/*.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.dartpackages/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.dartpackages/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.dartpackages/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()toFuture<void> dispose() asynccorrectly enables asynchronous cleanup. The ordering is appropriate withsuper.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: Addawaitto theNotificationServiceInterface.dispose()call site.The asynchronous signature change is correct, but the implementation is incomplete. Line 127 in
apps/app_core/lib/app/app.dartcallsgetIt<NotificationServiceInterface>().dispose()without awaiting it. Sincedispose()now returnsFuture<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 optimizationLearnt 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
There was a problem hiding this 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
📒 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 generatedAssetsclass fromflutter_genfor asset access instead of raw string paths likeImage.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.pathproperty 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: Usecontext.tfor accessing translations instead of hardcoded strings in Flutter widgets
UseVSpaceandHSpacecomponents for spacing instead of rawSizedBoxwidgets
UseAppButtoncomponent instead of raw Material buttons likeElevatedButtonorTextButton
Use predefinedAppTextcomponents (AppText.small(),AppText.medium(),AppText.large()) for text rendering
UseAppBorderRadiusconstants (small,medium,large) instead of raw border radius values
UseInsetsconstants for padding and margins instead of rawEdgeInsetsvalues
UseAppLoadingIndicatorcomponent for showing loading states
UseAppButtonwithisExpanded: truefor full-width buttons andisEnabledproperty for controlling button state
UseAppButtonvariants (secondary,outline,text,destructive) for different button styles instead of creating custom button implementations
UseAppCardcomponent for card-based layouts instead of rawCardorContainerwidgets
UseAppTextFieldcomponent for text input fields instead of raw MaterialTextFieldwidgets
**/*.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`.
There was a problem hiding this 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.dartalready re-exports everything fromflutter/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 asynclistencallback’s Future is ignored (risk of unhandled async errors). Storing theStreamSubscriptionand cancelling onclose()would make this more robust. Based on learnings, prefer explicit typing where it’s not obvious (same rationale applies to aStreamSubscriptionfield).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 whydependency_overridesare needed.Dependency overrides can hide version conflicts and complicate debugging. Document why
webandsource_genneed 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.1apps/app_core/lib/app/helpers/injection.dart (1)
4-8: Good: explicitRestApiClienttyping (stronger DI contract).
Consider making theselate 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
📒 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.xmlapps/app_core/lib/app/helpers/injection.dartapps/app_core/lib/app/observers/app_bloc_observer.dartapps/app_core/lib/app/routes/app_router.dartapps/app_core/lib/bootstrap.dartapps/app_core/lib/core/data/models/pagination_model.dartapps/app_core/lib/core/data/services/media.service.dartapps/app_core/lib/core/presentation/widgets/force_update_widget.dartapps/app_core/lib/modules/auth/repository/auth_repository.dartapps/app_core/lib/modules/auth/sign_in/bloc/sign_in_bloc.dartapps/app_core/lib/modules/auth/sign_up/bloc/sign_up_state.dartapps/app_core/lib/modules/home/repository/home_repository.dartapps/app_core/lib/modules/profile/bloc/profile_state.dartapps/app_core/lib/modules/profile/repository/profile_repository.dartapps/app_core/lib/modules/profile/screen/edit_profile_screen.dartapps/app_core/lib/modules/subscription/cubit/subscription_cubit.dartapps/app_core/pubspec.yamlapps/app_core/pubspec_overrides.yamlmelos.yamlpackages/api_client/pubspec.yamlpackages/app_notification_service/pubspec.yamlpackages/app_subscription/pubspec.yamlpackages/app_translations/pubspec.yamlpackages/app_ui/lib/src/theme/data/colors.dartpackages/app_ui/lib/src/widgets/molecules/app_network_image.dartpackages/app_ui/pubspec.yamlpackages/widgetbook/pubspec.yamlpackages/widgetbook/pubspec_overrides.yamlpubspec.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 generatedAssetsclass fromflutter_genfor asset access instead of raw string paths likeImage.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.pathproperty 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: Usecontext.tfor accessing translations instead of hardcoded strings in Flutter widgets
UseVSpaceandHSpacecomponents for spacing instead of rawSizedBoxwidgets
UseAppButtoncomponent instead of raw Material buttons likeElevatedButtonorTextButton
Use predefinedAppTextcomponents (AppText.small(),AppText.medium(),AppText.large()) for text rendering
UseAppBorderRadiusconstants (small,medium,large) instead of raw border radius values
UseInsetsconstants for padding and margins instead of rawEdgeInsetsvalues
UseAppLoadingIndicatorcomponent for showing loading states
UseAppButtonwithisExpanded: truefor full-width buttons andisEnabledproperty for controlling button state
UseAppButtonvariants (secondary,outline,text,destructive) for different button styles instead of creating custom button implementations
UseAppCardcomponent for card-based layouts instead of rawCardorContainerwidgets
UseAppTextFieldcomponent for text input fields instead of raw MaterialTextFieldwidgets
**/*.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.dartapps/app_core/lib/app/helpers/injection.dartapps/app_core/lib/modules/subscription/cubit/subscription_cubit.dartapps/app_core/lib/app/routes/app_router.dartapps/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
UseStatelessWidgetwhen possible
Keep build methods simple and focused
Avoid unnecessaryStatefulWidgets
Keep state as local as possible
Useconstconstructors when possible
Avoid expensive operations in build methods
Implement pagination for large lists
If you get a 'RenderFlex overflowed' error, check if aRoworColumncontains unconstrained widgets. Fix by wrapping children inFlexible,Expanded, or by setting constraints.
If you get 'Vertical viewport was given unbounded height', ensureListViewor similar scrollable widgets inside aColumnhave a bounded height
If you get 'An InputDecorator...cannot have an unbounded width', constrain the width of widgets likeTextField
If you get a 'setState called during build' error, do not callsetStateorshowDialogdirectly inside the build method
If you get 'The ScrollController is attached to multiple scroll views', make sure eachScrollControlleris 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 runmelos run build-runnercommand 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
Returnthisas 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 wrappedRouteTo 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.dartpackages/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.dartpackages/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.dartapps/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.dartapps/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.yamlapps/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 == falseto!allowCancelis 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
replaceInRouteNameparameter 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.,SignInScreen→SignInRoute).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 bootstrapin 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_inAppPurchasetype 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.2to^7.3.0is a major version bump — ensure the updatedmelos.yamlscripts 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.enviedat^1.3.2andenvied_generatorat^1.1.1are fully compatible. The generator's constraint^1.1.0explicitly 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.2for 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, andwidgetbook-genscripts are well-structured:
- Adding
--delete-conflicting-outputsis a good practice for build_runner- The
go-ios-gomulti-line script with explicit cleanup steps is cleaner- Consistent use of
dart runinstead offlutter pub runAlso 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== truecheck while reading cleaner.packages/app_notification_service/pubspec.yaml (1)
5-10: The workspace configuration is correctly set up. The rootpubspec.yamldefines the workspace with all packages listed (includingapp_notification_service), and all workspace packages haveresolution: workspaceconsistently applied. The SDK constraint (3.7.2+) meets the pub workspaces minimum requirement (3.6.0), sopub getand CI will resolve dependencies consistently across all packages using a sharedpubspec.lockat the workspace root.
melos.yaml
Outdated
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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: 10Option 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
| 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: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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: 10Option 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.
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
# First, let's examine the actual pubspec.yaml file
cat -n packages/api_client/pubspec.yaml | head -40Repository: 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 possiblyunnecessary_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:
- That the environment constraints are updated to match flutter_lints 6.0.0's requirements
- 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.
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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]
- Upgrade
- Update dev dependency: flutter pub add --dev very_good_analysis (or change pubspec to ^10.0.0). [2]
- 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]
- SDK and analyzer compatibility
- v10.0.0 adds support for Dart 3.9.0 — ensure your SDK lower bound / toolchain is compatible. [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]
- 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.
- 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:
- Update
analysis_options.yamlto include the v10 analysis file:package:very_good_analysis/analysis_options.10.0.0.yaml - Run
flutter analyzeto identify any new lints introduced byflutter_lints6.0.0 (notablystrict_top_level_inference) and removed rules (e.g.,diagnostic_describe_all_properties) - 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`.
There was a problem hiding this 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:
isLoadingis initialized tofalse(line 27)onPageFinishedsetsisLoading = false(line 40)- The UI shows the loading indicator when
!isLoadingis true (line 62)This means the WebView will never be rendered since
isLoadingis never set totrue.🐛 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
isConnectedgetter returns the same value in both branches of the ternary expression. This should either return aboolor be simplified.Suggested fix
- ConnectionStatus get isConnected => connectionStatus == ConnectionStatus.online - ? ConnectionStatus.online - : ConnectionStatus.offline; + bool get isConnected => connectionStatus == ConnectionStatus.online;Or if
ConnectionStatusreturn 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 indispose(). 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.xxxlarge66andInsets.xxxxlarge80incorrectly 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 unusedgetData()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
DeviceFrameAddontoViewportAddonaligns 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 beforeinit(), accessing thelate final listenerwill throw aLateInitializationError. 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
awaitwith.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
_loginWithApplemethod still uses the synchronous fire-and-forget pattern with.then(), while_loginWithGooglewas 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)→ considerInsetsconstants- Line 48:
Colors.blue→ considercontext.colorScheme- Line 52: Raw
Textwidget with hardcodedColors.white→ considerAppTextwith theme colorsSince this is a widgetbook demo showcasing
AppBorderRadiusspecifically, these may be intentional. Based on learnings, the project prefersInsetsconstants andcontext.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
StringfromminLinesOptions, 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 usingAppTextfor consistency.The body uses a raw
Textwidget. Per coding guidelines, preferAppTextfor 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 afterdispose()is called. If you later makeonEndScroll/onTopScrolltruly async as suggested above, you should add amountedcheck 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
📒 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.xmlapps/app_core/lib/app/app.dartapps/app_core/lib/app/helpers/mixins/pagination_mixin.dartapps/app_core/lib/app/helpers/permission/permission_helper.dartapps/app_core/lib/core/data/services/connectivity_service.dartapps/app_core/lib/core/data/services/network_helper.service.dartapps/app_core/lib/core/presentation/screens/webview_screen.dartapps/app_core/lib/core/presentation/widgets/force_update_widget.dartapps/app_core/lib/modules/auth/sign_in/screens/sign_in_screen.dartapps/app_core/lib/modules/change_password/screen/change_password_screen.dartapps/app_core/pubspec.yamlmelos.yamlpackages/api_client/lib/src/api_tokens_interceptor.dartpackages/app_subscription/pubspec.yamlpackages/widgetbook/lib/main.dartpackages/widgetbook/lib/widgets/animation/slide_and_fade_animation_wrapper.dartpackages/widgetbook/lib/widgets/atoms/app_border_radius.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/widgetbook/lib/widgets/atoms/padding.dartpackages/widgetbook/lib/widgets/atoms/spacing.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartpackages/widgetbook/lib/widgets/molecules/app_text_field.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartpackages/widgetbook/lib/widgets/organisms/app_scaffold.dartpubspec.yamlscripts/mason-lock.jsonscripts/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 generatedAssetsclass fromflutter_genfor asset access instead of raw string paths likeImage.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.pathproperty 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: Usecontext.tfor accessing translations instead of hardcoded strings in Flutter widgets
UseVSpaceandHSpacecomponents for spacing instead of rawSizedBoxwidgets
UseAppButtoncomponent instead of raw Material buttons likeElevatedButtonorTextButton
Use predefinedAppTextcomponents (AppText.small(),AppText.medium(),AppText.large()) for text rendering
UseAppBorderRadiusconstants (small,medium,large) instead of raw border radius values
UseInsetsconstants for padding and margins instead of rawEdgeInsetsvalues
UseAppLoadingIndicatorcomponent for showing loading states
UseAppButtonwithisExpanded: truefor full-width buttons andisEnabledproperty for controlling button state
UseAppButtonvariants (secondary,outline,text,destructive) for different button styles instead of creating custom button implementations
UseAppCardcomponent for card-based layouts instead of rawCardorContainerwidgets
UseAppTextFieldcomponent for text input fields instead of raw MaterialTextFieldwidgets
**/*.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.dartpackages/api_client/lib/src/api_tokens_interceptor.dartpackages/widgetbook/lib/main.dartpackages/widgetbook/lib/widgets/molecules/app_text_field.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/organisms/app_scaffold.dartapps/app_core/lib/core/data/services/network_helper.service.dartpackages/widgetbook/lib/widgets/atoms/padding.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartpackages/widgetbook/lib/widgets/animation/slide_and_fade_animation_wrapper.dartapps/app_core/lib/core/presentation/screens/webview_screen.dartapps/app_core/lib/app/helpers/mixins/pagination_mixin.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartapps/app_core/lib/app/helpers/permission/permission_helper.dartpackages/widgetbook/lib/widgets/atoms/spacing.dartpackages/widgetbook/lib/widgets/atoms/app_border_radius.dartapps/app_core/lib/modules/change_password/screen/change_password_screen.dartapps/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
Returnthisas the child widget in AutoRouteWrapper's wrappedRoute method after setting up MultiRepositoryProvider and MultiBlocProvider
Files:
apps/app_core/lib/core/presentation/screens/webview_screen.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartapps/app_core/lib/modules/change_password/screen/change_password_screen.dartapps/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 wrappedRouteTo 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.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartapps/app_core/lib/modules/change_password/screen/change_password_screen.dartapps/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.dartapps/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.dartapps/app_core/lib/core/data/services/network_helper.service.dartapps/app_core/lib/app/helpers/mixins/pagination_mixin.dartapps/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.dartpackages/widgetbook/lib/widgets/molecules/app_text_field.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/atoms/padding.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartpackages/widgetbook/lib/widgets/atoms/spacing.dartpackages/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.dartpackages/widgetbook/lib/widgets/molecules/app_text_field.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartpackages/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.dartpackages/widgetbook/lib/widgets/molecules/app_text_field.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/atoms/padding.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartpackages/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.dartpackages/widgetbook/lib/widgets/atoms/spacing.dartapps/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.dartpackages/widgetbook/lib/widgets/molecules/app_text_field.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartpackages/widgetbook/lib/widgets/animation/slide_and_fade_animation_wrapper.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartpackages/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.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartapps/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.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/organisms/app_scaffold.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartpackages/widgetbook/lib/widgets/atoms/spacing.dartpackages/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.dartpackages/widgetbook/lib/widgets/molecules/app_button.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/organisms/app_scaffold.dartpackages/widgetbook/lib/widgets/atoms/padding.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/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.dartpackages/widgetbook/lib/widgets/molecules/app_circular_progress_indicator.dartpackages/widgetbook/lib/widgets/atoms/padding.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartpackages/widgetbook/lib/widgets/molecules/empty_screen.dartpackages/widgetbook/lib/widgets/atoms/app_border_radius.dartapps/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.dartpackages/widgetbook/lib/widgets/molecules/app_dropdown.dartapps/app_core/lib/core/presentation/screens/webview_screen.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/atoms/app_text.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartapps/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.dartapps/app_core/lib/modules/change_password/screen/change_password_screen.dartapps/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.dartpackages/widgetbook/lib/widgets/atoms/padding.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/widgetbook/lib/widgets/molecules/app_network_image.dartpackages/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.dartpackages/widgetbook/lib/widgets/organisms/app_scaffold.dartpackages/widgetbook/lib/widgets/molecules/app_bar.dartpackages/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.dartpackages/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.dartapps/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.dartapps/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_TERMINALfor 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-apkconfiguration update. Terminal execution is beneficial for build commands that produce significant output.packages/widgetbook/lib/main.dart (1)
34-46: LGTM!The
appBuilderconfiguration correctly usescontext.colorScheme.grey300for 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 ofunawaitedwithmountedguard for async initialization.The pattern of wrapping async calls in
unawaited()withininitStateand checkingmountedbeforesetStateis 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() asyncwithawait listener.cancel()follows best practices for asynchronous disposal of stream subscriptions. This aligns with the coding guidelines for usingFuture<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() asyncwithawait _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
pushRouteisn'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
AppButtonwithisExpanded: trueas 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>toknobs.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.valuesas 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.tryParsehandling at line 124.packages/widgetbook/lib/widgets/molecules/app_button.dart (3)
17-21: LGTM! ButtonType enum dropdown migration.The migration correctly uses
ButtonType.valueswith 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>toknobs.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
BoxShapewith 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
constmodifier on the options list.
71-81: LGTM! Content Padding Type knob migration is correct.The dropdown maintains all padding type options with
constoptimization.packages/widgetbook/lib/widgets/atoms/spacing.dart (2)
11-35: LGTM! VSpace knob migration usesInsetsconstants correctly.The dropdown properly uses design system constants (
Insets.xxsmall4, etc.) which aligns with coding guidelines.Note: No
initialOptionis specified, so the dropdown defaults to the first option (Insets.xxsmall4). IfInsets.medium16was the previous default, consider addinginitialOption: Insets.medium16to maintain the same behavior.
54-74: LGTM! HSpace knob migration is correct.Same observation as VSpace: no
initialOptionspecified, defaulting toInsets.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>toknobs.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
titleColorandbackgroundColorknob migrations fromknobs.list<Color>toknobs.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 thelabelBuilder. TheinitialOptionis properly preserved.
44-63: LGTM on the TextAlign dropdown migration.The migration to
knobs.object.dropdown<TextAlign>is correct. ThelabelBuilderhandles allTextAlignvalues 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 thatopenAppSettings()returns aFuture<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: workspacedirective 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 withvery_good_analysisv10.0.0 upgrade.The major version jump (7.x → 10.x) does remove some rules (e.g.,
require_trailing_commasin v8.0.0,diagnostic_describe_all_propertiesin v10.0.0), but the codebase is safe. Theapps/app_core/analysis_options.yamlincludespackage:very_good_analysis/analysis_options.yamldirectly, 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.
| Future<void> listener() async { | ||
| if (scrollController.offset > scrollController.position.maxScrollExtent - 50) { | ||
| _checkIfCanLoadMore(); | ||
| await _checkIfCanLoadMore(); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Async conversion is ineffective in this context.
Two issues with this change:
ScrollController.addListener()expects aVoidCallback, so the returnedFuture<void>is ignored by the scroll controller._checkIfCanLoadMore()contains noawaitstatements—it calls synchronousonEndScroll()/onTopScroll()and resets the guard flags immediately, so theawaiton 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()returnFuture<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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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
- Bump your app's Flutter SDK constraint to >=3.28 in pubspec.yaml (or upgrade your Flutter SDK). [1]
- 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]
- 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]
- 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/Podfileand 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`.
There was a problem hiding this 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, andfirebase_crashlytics 4.3.5require 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: Redundantlatemodifier.Since
webViewControlleris initialized at declaration,lateis unnecessary. Consider usingfinalinstead.♻️ 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_crashlyticsentry 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_lintsandvery_good_analysisare included. Sincevery_good_analysisprovides a more comprehensive and stricter ruleset that encompassesflutter_lints, you can removeflutter_lintsto 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.4Also applies to: 107-107
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
apps/app_core/lib/core/presentation/screens/webview_screen.dartapps/app_core/pubspec.yaml
🧰 Additional context used
📓 Path-based instructions (3)
**/*.dart
📄 CodeRabbit inference engine (.cursor/rules/assets-rules.mdc)
**/*.dart: Use generatedAssetsclass fromflutter_genfor asset access instead of raw string paths likeImage.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.pathproperty 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: Usecontext.tfor accessing translations instead of hardcoded strings in Flutter widgets
UseVSpaceandHSpacecomponents for spacing instead of rawSizedBoxwidgets
UseAppButtoncomponent instead of raw Material buttons likeElevatedButtonorTextButton
Use predefinedAppTextcomponents (AppText.small(),AppText.medium(),AppText.large()) for text rendering
UseAppBorderRadiusconstants (small,medium,large) instead of raw border radius values
UseInsetsconstants for padding and margins instead of rawEdgeInsetsvalues
UseAppLoadingIndicatorcomponent for showing loading states
UseAppButtonwithisExpanded: truefor full-width buttons andisEnabledproperty for controlling button state
UseAppButtonvariants (secondary,outline,text,destructive) for different button styles instead of creating custom button implementations
UseAppCardcomponent for card-based layouts instead of rawCardorContainerwidgets
UseAppTextFieldcomponent for text input fields instead of raw MaterialTextFieldwidgets
**/*.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
Returnthisas 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 wrappedRouteTo 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:asyncimport is correctly added forunawaited, 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.colorSchemefor colors andAppCircularProgressIndicatorfor 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: workspacedirective and version-less workspace package references are appropriate for Dart's workspace/monorepo support. The rootpubspec.yamlproperly defines the workspace and lists all member packages.
pratik-7span
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changes approved
Description
Type of Change
Summary by CodeRabbit
Chores
Refactor
✏️ Tip: You can customize this high-level summary in your review settings.