Focused Agent Skills for complete Flutter and Dart app delivery.
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Proper disposal of state resources prevents memory leaks and unintended behavior across screens or sessions. Follow these rules for common patterns.
dispose() and have the actual owner dispose it. A provider that creates the notifier may already do this. Remove a listener explicitly if the notifier outlives it.close(). If the Bloc creates standard Dart Streams, ensure they are canceled here.autoDispose providers, rely on Riverpod's internal cleanup, but explicitly register disposal callbacks via ref.onDispose for native resources or non-Riverpod listeners.StreamController created locally. Do this in dispose() or the equivalent lifecycle teardown method.StreamSubscription instances when the class that created them is disposed. Do not rely on garbage collection for active subscriptions.dispose() directly covers cleanup logic separately.dispose() twice (if allowed by the framework) is safe or throws appropriately, and verify no updates are emitted post-disposal.close() calls on controllers or missing cancel() calls on subscriptions are the primary sources of leaks in Flutter apps. Review these carefully.await: Check the resolved version in pubspec.lock. In Riverpod 2.x, register cancellation or invalidate a captured lifetime token with ref.onDispose before the async gap. Guard both success and error before updating the notifier's state. Riverpod 3.0 introduced Ref.mounted. On versions that support it, capture the request's Ref before awaiting and check that instance before publishing. Use an operation identity when requests can supersede one another. Retain a disposal or generation guard for rebuilds on versions older than 3.2.0, which fixed Ref.mounted on stale refs after rebuild.ref.keepAlive() contract and close its returned link when retention ends. Test normal completion, owner removal while pending, and late success or error. Include provider recomputation when it can replace the in-flight request.restartable/switch-latest, or droppable) for any handler that performs async work. Default concurrent event handling lets rapid repeated events run their async bodies out of order and call emit after the Bloc has moved on to a different state. Treat an emit.isDone guard as a secondary safeguard once the transformer is correct, not a substitute for choosing the right one..tessl-plugin
skills
dart-concurrency
dart-language
flutter-accessibility
flutter-ai-integration
flutter-animation
flutter-app-workflow
flutter-architecture
flutter-authentication
flutter-background-execution
flutter-build-release
flutter-ci-cd
flutter-code-review
flutter-dependency-upgrades
flutter-device-testing
flutter-figma-workflow
flutter-in-app-purchases
flutter-localization
references
flutter-location-maps
flutter-media
flutter-networking
flutter-notifications
flutter-observability
flutter-openapi-client
flutter-package-development
flutter-payments-checkout
flutter-performance
flutter-persistence
flutter-platform-integration
flutter-product-analytics
flutter-responsive-layout
flutter-runtime-debugging
flutter-security
flutter-state-management
flutter-testing
flutter-text-rendering
references
flutter-ui-design
flutter-ui-patterns
flutter-visual-effects