{"id":"d66f3e51-cae3-4918-a216-d8449e9bf7e2","shortId":"jB8rSL","kind":"skill","title":"building-flutter-apps","tagline":">-","description":"## Gate\n\nOn skill activation, emit verbatim once:\n\n> building-flutter-apps active. Pre-flight required.\n\nBefore writing any `.dart` code, emit verbatim:\n\n> Reading building-flutter-apps gate.\n\nAfter every code change to a `.dart` file (or to `pubspec.yaml` / `build.yaml` / `analysis_options.yaml`):\n\n1. Run `dart analyze` from the package root. Block on any ERROR or WARNING.\n2. Emit the filled-in Pre-Flight checklist. T0 always. T1 / T2 only if their domain was touched.\n3. If `dart analyze` is not wired with `flutter_skill_lints`, run Setup before continuing.\n\n## Critical Rules\n\n1. **Use `dart analyze` from package root**, never `flutter analyze` and never path-scoped. Copy [references/analysis_options.yaml](references/analysis_options.yaml) to project root and wire `flutter_skill_lints` + `riverpod_lint` under `plugins:`. `flutter analyze lib` silently drops plugin diagnostics ([flutter#184190](https://github.com/flutter/flutter/issues/184190)).\n\n2. **Use `@riverpod` / `@Riverpod` codegen for every provider** — state, computed, repository, datasource, service, family, stream. Never manual `Provider`, `FutureProvider`, `StreamProvider`, `StateProvider`, `StateNotifierProvider`, `NotifierProvider`, `AsyncNotifierProvider`, `ChangeNotifierProvider`. Run `dart run build_runner watch --delete-conflicting-outputs`.\n\n3. **Guard every `await`** in notifiers and repositories with `if (!ref.mounted) return;`. Guard every `await` in widgets and `State` with `if (!context.mounted) return;`. Inside `State`, never `if (mounted)` — always `if (!context.mounted) return;`. **Inside `finally`, use the guard form `if (ref.mounted) { ... }`** — never `if (!ref.mounted) return;`.\n\n4. **Extract widgets to public classes.** No `_buildXxx()` helpers. No `class _Foo extends StatelessWidget | StatefulWidget | ConsumerWidget | ConsumerStatefulWidget | HookWidget | HookConsumerWidget`. Mark file-internal widgets `@visibleForTesting`. `_FooState extends State<Foo>` stays private (Flutter convention — exempt).\n\n5. **Use `Object?` or a specific type** for unknown values. `dynamic` only for `Map<String, dynamic>` JSON. Never `value!` — use `if (value case final v?)`.\n\n6. **Use `AppLocalizations` (gen-l10n)** for every user-facing string. Never hardcode UI copy in widgets, notifiers, repositories, or datasources. In widgets, bind `final l10n = context.l10n;` at the top of `build` and use `l10n.someKey`; never chain `context.l10n.someKey`. `*Strings` constants only for non-user-facing IDs. For l10n config, put ARB files in `arb-dir` (`lib/l10n` by default). Generated Dart is written to `${arb-dir}/${output-localization-file}` unless `output-dir` is set; import `app_localizations.dart` from that directory.\n\n7. **Use `sealed class` for Freezed unions and states.** Never `abstract class` with `@freezed`. Match with Dart native `switch` — never Freezed `.when()` / `.map()`. For VOs in `/domain/values/`, annotate `@Freezed(map: FreezedMapOptions.none, when: FreezedWhenOptions.none)` to disable codegen of those methods entirely. Lint: `freezed_disable_map_when_required`.\n\n8. **Never prop-drill state.** Child widgets read providers directly with `ref.watch` / `ref.read` / `ref.listen`. Do not pass entity / state / notifier instances through constructors. Constructor params allowed: immutable IDs (for routing/lookup), callbacks, `Key`, and primitive props on leaf atoms. `ConsumerState` may own lifecycle handles, not provider-derived `*Cache`/`*Source`/`*DayStart` fields; use computed providers or local `build` values. Lint: `riverpod_consumer_state_derived_cache`.\n\n9. **Use a mixin when the same behavior appears in 2+ classes.** Extract to a `mixin` with an `on` clause (e.g. `mixin RetryMixin on AsyncNotifier<X>`). Suffix the name with `Mixin`. Copy-paste sharing across notifiers, widgets, or services is forbidden — replace with a mixin.\n\n10. **Storage SDK calls live in Local Datasource, never in Notifier.** Hive (`Hive.openBox`, `box.get/put/delete`, `Hive.box`), `SharedPreferences`, `flutter_secure_storage`, `dart:io` file ops, `path_provider` directory access — all live behind a `Local<X>Datasource` interface, called by `<X>Repository`. Notifiers and widgets never import `hive_ce` / `shared_preferences` / `flutter_secure_storage` / `dart:io` / `path_provider`.\n\n11. **Primitives → `core/extensions/`. Never inline.** `DateTime` / `String` / `int` / `double` / `num` / `Duration` / `Iterable` / `BuildContext` ops (capitalize, timeAgo, currency, percent, clamp, format) in `core/extensions/{type}_extensions.dart`, barrel `extensions.dart`. Call `.timeAgo` / `.capitalized` / `.asCurrency` / `.clamped(...)` / `.pluralized(...)`. Forbidden: `'${s[0].toUpperCase()}${s.substring(1)}'`, `DateTime.now().difference(...)`, `DateTime.now().toUtc()`, `DateTime.timestamp()`, `DateTimeX.nowLocal().startOfDay`, `DateTimeX.nowLocal().calendarDaysBefore(...)`, `NumberFormat.currency(...).format(...)`, inline `.clamp(...)`. Raw executable strings and numbers are magic literals; move them to named constants, Value Objects, or semantic helpers. Current time helpers live in `DateTimeX` (`nowUtc`, `nowLocal`); current-day boundaries such as `nowLocalStartOfDay` and repeated local calendar windows such as \"60 days ago\" get semantic `DateTimeX` helpers. Calendar-day helpers reconstruct date components; they do not subtract `Duration(days: ...)` across DST-sensitive local dates. Persisted/server timestamps MUST use UTC helpers, and local calendar bucketing of stored timestamps MUST convert to local first. Lints: `datetime_now_requires_timezone_intent`, `avoid_magic_literals` (suppress with a comment only when local raw time or literal ownership is intentional and app-specific). **Why:** SSOT — one fix updates every call site. **Apply:** 2+ uses → extension. **Domain entities NEVER import `core/extensions/`** (outer dep, `arch_domain_import` ERROR). Domain derive via entity getter (one-off) OR Value Object (cross-entity — Rule 12). See [extensions-utilities.md](references/extensions-utilities.md).\n\n12. **Wrap domain primitives in Value Objects.** Domain-meaning `double`/`int`/`String` (unit, currency, measure, identity, format) → sealed Freezed VO in `/domain/values/`. Raw redirects PRIVATE (`._meters`/`._raw`); public factories MUST contain explicit guards in body (`if (v.isNaN) throw ArgumentError.value(...)`, `if (!v.isFinite) throw ...`, domain assertions), NEVER passthrough (`factory X.unit(T v) => X._unit(v);` is rejected — same risk as a public raw redirect). No named primitive factories on domain entities — convert at data/notifier/import boundaries. No hand-written `copyWith` in `/domain/`. **Hive collision:** Hive Models in `/data/models/` hold primitives only; VOs live on domain Entity, mapper bridges. Never change ctor param types or order on a `@GenerateAdapters`-registered class with shipped user data — silent box corruption, `dart analyze` blind to disk. **Apply:** primitive in 2+ entities → VO. Bare `double distanceMeters` at entity boundary = smell. See [value-objects.md](references/value-objects.md), [hive-persistence.md](references/hive-persistence.md). Lints: `vo_public_raw_constructor` (catches public redirect AND passthrough), `domain_entity_primitive_factory`, `domain_custom_copy_with`, `hive_field_no_vo_type`.\n\n13. **Keep typed GoRouter routes as the navigation SSOT.** Define routes once with `go_router_builder`, then navigate with generated route helpers such as `SomeRoute(...).go(context)` and `SomeRoute(...).push<T>(context)`. Keep route paths inside route definitions and generated helpers. Local sheets/dialogs use semantic helpers and `Navigator.pop` for dismissal. Navigation lints enforce typed routes, local modal helpers, and typed fallback behavior.\n\n## Trigger Map\n\nBefore writing code in any row below, output `Reading: <ref-name>` and read the listed reference(s).\n\n| Touching | Read |\n|---|---|\n| Notifier, AsyncNotifier, mutation method, `ref.read` / `ref.watch` / `ref.listen`, `_ensureRepository`, async cancellation, sync `Notifier` init | [state-management.md](references/state-management.md) |\n| Freezed entity, sealed union, `fromJson` / `toJson`, `copyWith`, model vs entity, `build.yaml` for `explicit_to_json` | [freezed-sealed.md](references/freezed-sealed.md) |\n| Provider declaration, `@riverpod`, family, `keepAlive`, codegen, `Mutation<T>` (experimental) | [riverpod-codegen.md](references/riverpod-codegen.md) |\n| Repository, datasource, domain entity, layered architecture, `IHttpService`, mapping models to entities | [architecture.md](references/architecture.md) |\n| Value Object, primitive obsession, `Distance`/`Money`/`Email`/`Slug`, unit conversion in domain, cross-entity primitive, `double distanceMeters`/`int amountCents`/`String email` smell, `arch_domain_import` error | [value-objects.md](references/value-objects.md) |\n| GoRouter, typed route, redirect, `context.go`, deep link, cold-start, navigation gate | [architecture.md](references/architecture.md) + [deep-linking.md](references/deep-linking.md) |\n| HTTP, network, REST, source-of-truth fetch after mutation, transport id vs domain id | [networking.md](references/networking.md) |\n| Atom, molecule, organism, design tokens, atomic widgets, `core/widgets/` promotion | [atomic-design.md](references/atomic-design.md) |\n| Showcase, `AppShowcaseTarget`, `startShowCase`, replay, `ShowcaseKeys`, `ProviderSubscription` lifecycle | [showcase-tours.md](references/showcase-tours.md) |\n| Widget test, `ProviderContainer.test()`, `UncontrolledProviderScope`, fakes, mocks, `AppWidgetKeys`, event-contract tests | [testing.md](references/testing.md) |\n| `flutter_driver`, Dart MCP, E2E, `integration_test`, semantic selectors, log capture | [dart-mcp-e2e-testing.md](references/dart-mcp-e2e-testing.md) |\n| Hive, `TypeAdapter`, TypeId, box, persistence migration, retired field accounting | [hive-persistence.md](references/hive-persistence.md) |\n| Crashlytics, error reporting, `Crash` facade, recoverable error classifier, symbol upload, three-hook wiring (`FlutterError.onError` + `PlatformDispatcher.instance.onError` + `Isolate.current.addErrorListener`), `runZonedGuarded` legacy (Flutter 3.3+) | [crashlytics.md](references/crashlytics.md) |\n| Mixin, capability vs interface, retry helper, RNG, bulk operation | [mixins.md](references/mixins.md) |\n| Service, singleton, fire-and-forget, `abstract final class`, `unawaited()`, `Future<void>` signature | [services-and-singletons.md](references/services-and-singletons.md) |\n| `@Preview`, `widget_previews.dart`, preview fakes, deterministic preview data | [widget-previews.md](references/widget-previews.md) |\n| `AppLocalizations`, ARB file, gen-l10n, locale fallback, placeholders, plural / select | [localization.md](references/localization.md) |\n| Performance, build cost, `.select()`, `const` constructors, `ListView.builder`, large list compute | [performance.md](references/performance.md) + [flutter-optimizations.md](references/flutter-optimizations.md) |\n| `LayoutBuilder`, `RenderFlex` overflow, `Expanded` / `Flexible` outside `Row` / `Column`, `Positioned` outside `Stack`, text-scale clamp | [layout-diagnostics.md](references/layout-diagnostics.md) |\n| Extension, `SnackBarUtils`, snackbar dispatch from notifier, `@visibleForTesting` helpers, `DateTime` format/diff/timeAgo/startOfDay, `String` capitalize/truncate/titleCase/initials/format, `int` / `double` / `num` clamp/pluralized/asCurrency/percent/toFixed, `Duration` format, parse/format, `NumberFormat`, `DateFormat`, `intl`, `core/extensions/` | [extensions-utilities.md](references/extensions-utilities.md) |\n| Records `(x, y)`, extension type IDs, pattern matching, guard clause `case _ when ...` | [dart-patterns-records.md](references/dart-patterns-records.md) |\n| `analysis_options.yaml`, `dart analyze`, plugin wiring, `riverpod_lint` pre-release pin, analyzer crash | [analysis-options.md](references/analysis-options.md) + [analysis_options.yaml](references/analysis_options.yaml) |\n| Common navigation / form / list / debounce / route-param-fallback patterns | [common-patterns.md](references/common-patterns.md) |\n\n## Core Stack\n\nVersion SSOT: [README.md → Core Stack](README.md).\n\n| Package | Version | Purpose |\n|---------|---------|---------|\n| flutter_riverpod + riverpod_annotation + riverpod_generator | `^3.3.1` / `^4.0.2` / `^4.0.3` | State management (codegen) |\n| freezed + freezed_annotation | `^3.2.5` / `^3.1.0` | Immutable data classes, unions |\n| go_router + go_router_builder | `^17.2.3` / `^4.3.0` | Declarative, type-safe routing |\n| json_serializable + build_runner | `6.13.0` / `^2.15.0` | JSON serialization + code generation |\n| showcaseview | `^5.0.2` | First-run guided tours |\n| hive_ce + hive_ce_flutter + hive_ce_generator | `^2.19.3` / `^2.3.4` / `1.11.0` | Local persistence |\n\n## Architecture\n\n```mermaid\ngraph LR\n  P[Presentation] --> R[Repository]\n  R --> Do[Domain]\n  R --> Da[Data]\n  Da -.-> Do\n```\n\n```\nlib/\n├── core/\n├── features/\n│   └── feature_x/\n│       ├── data/           # Models, datasources (API / local)\n│       ├── domain/         # Entities (pure Dart, no Flutter imports)\n│       ├── repositories/   # Map models → entities\n│       └── presentation/   # Notifiers, screens, widgets\n└── main.dart\n```\n\nRepository returns Domain entities (never Models). Domain has no Flutter import. Datasource throws typed exceptions, never returns null on failure. `try`/`catch` lives in the Notifier — never in Domain or Datasource.\n\n## Class Modifiers\n\n| Modifier | Extend outside lib | Implement outside lib | Instantiate | Mixin |\n|---|:---:|:---:|:---:|:---:|\n| `abstract class` | ✓ | ✓ | ✗ | ✗ |\n| `abstract interface class` | ✗ | ✓ | ✗ | ✗ |\n| `abstract final class` | ✗ | ✗ | ✗ | ✗ |\n| `sealed class` | ✗ | ✗ | ✗ | ✗ |\n| `base class` | ✓ | ✗ | ✓ | ✗ |\n| `interface class` | ✗ | ✓ | ✓ | ✗ |\n| `final class` | ✗ | ✗ | ✓ | ✗ |\n| `mixin class` | ✓ | ✓ | ✓ | ✓ |\n\n`abstract interface class` for repository / datasource / service contracts. `sealed class` for Freezed unions. `abstract final class` for pure stateless helper namespaces (`Crash`, `Storage`).\n\n## Code Generation\n\n```bash\ndart run build_runner watch --delete-conflicting-outputs\ndart run build_runner build --delete-conflicting-outputs\ndart run build_runner clean && dart run build_runner build --delete-conflicting-outputs\n```\n\n## Setup\n\n1. Copy [references/analysis_options.yaml](references/analysis_options.yaml) to project root. It already wires `flutter_skill_lints` + `riverpod_lint` under `plugins:`.\n2. `flutter_skill_lints` is an analyzer plugin — it lives **only** in `analysis_options.yaml plugins:`. Never add it to `pubspec.yaml`.\n3. Run `dart pub get`. Confirm `dart analyze` exits 0.\n4. Sanity check: write `Widget _buildHeader() => const SizedBox();` — `dart analyze` must flag it.\n\n### Per-Tool Hooks\n\n| Tool | Auto-install command | Hook source |\n|---|---|---|\n| Claude Code | `/plugin marketplace add sgaabdu4/building-flutter-apps` then `/plugin install building-flutter-apps@building-flutter-apps`; run `/reload-plugins` in the active session | `hooks/hooks.json` |\n| Codex CLI | `codex features enable hooks`, `codex features enable plugin_hooks`, `codex plugin marketplace add sgaabdu4/building-flutter-apps`, then `codex` → `/plugins` → install | `hooks/hooks.json` |\n| Copilot CLI | `copilot plugin marketplace add sgaabdu4/building-flutter-apps` then `copilot plugin install building-flutter-apps@building-flutter-apps` | `hooks/hooks.copilot.json` |\n\nRaw skill installs are guidance-only. They load this file but cannot register\nruntime hooks or run scanners. Use plugin installs when enforcement matters.\n\n## Pre-Flight\n\nFill T0 always after any `.dart` write. Fill T1 if state / notifier / mutation touched. Fill T2 if network / E2E / stream / showcase / route touched. Emit before yielding the turn.\n\n### T0\n\n- [ ] `dart analyze` exits 0 with `flutter_skill_lints` + `riverpod_lint` wired\n- [ ] `if (!ref.mounted) return;` after every `await` in notifiers and repositories\n- [ ] `if (!context.mounted) return;` after every `await` in widgets and `State` (no bare `if (mounted)`)\n- [ ] Inside `finally`, use guard form `if (ref.mounted) { ... }` — never early-return\n- [ ] No `_buildXxx()` and no private widget classes extending Stateless / Stateful / Consumer / Hook widgets (`State` subclasses exempt)\n- [ ] No `dynamic` except `Map<String, dynamic>` for JSON; no `value!`\n- [ ] Widgets bind `final l10n = context.l10n;` before localized key reads; no chained `context.l10n.someKey`\n- [ ] All providers `@riverpod` codegen; no manual `Provider(...)` family\n- [ ] No prop-drilling: children watch providers directly. No entity / state / notifier in constructors\n- [ ] Shared behavior across 2+ classes lives in a `mixin` (suffixed `Mixin`), not copy-pasted\n- [ ] No `hive_ce` / `shared_preferences` / `flutter_secure_storage` / `dart:io` / `path_provider` imports in notifier or widget files — storage goes through `Local<X>Datasource` → `<X>Repository`\n- [ ] No inline primitive ops outside `core/extensions/` — use `.capitalized` / `.timeAgo` / `.asCurrency` / `.clamped(...)` / `.pluralized(...)` / `DateTimeX.nowUtc()`. Forbidden: `'${s[0].toUpperCase()}...'`, date now/diff/UTC/timestamp chains, local calendar windows, ad-hoc `NumberFormat`, inline `.clamp(...)`, raw key/id/limit/threshold literals\n- [ ] Domain entity imports = `freezed_annotation` + `/domain/` paths only. Zero `core/`, `data/`, `presentation/`, `package:flutter`, `dart:ui`\n- [ ] Domain primitives with unit / currency / measure / identity wrapped in VO (`Distance`/`Money`/`Email`) — no bare `double distanceMeters` / `int amountCents` / `String email` at entity boundary\n- [ ] VO raw redirects PRIVATE (`._meters` / `._raw`); only validated factories public (`vo_public_raw_constructor`)\n- [ ] No named primitive factories on `@freezed` domain entities (`factory User.fromPrimitives(...)` forbidden — convert at data/notifier/import boundary) (`domain_entity_primitive_factory`)\n- [ ] No hand-written `copyWith` in `/domain/` — let Freezed generate from the redirect (`domain_custom_copy_with`)\n\n### T1 — State / Notifier / Mutation\n\n- [ ] Mutation methods (`create*`, `update*`, `delete*`, `set*`, `reorder*`) init deps via `_ensureRepository()` / `_ensureDependencies()` lazily\n- [ ] Sync `Notifier.build()` does not read `state` before first return; seed via constructor; defer async with `Future.microtask`\n- [ ] `ref.onDispose()` cancels every subscription / controller / timer\n- [ ] No provider-derived `*Cache`/`*Source`/`*DayStart`/`*TodayStart` fields in `ConsumerState`; use computed providers or local `build` values\n- [ ] Notifier owns snackbar dispatch — widgets do not call `SnackBarUtils.show*` or `ScaffoldMessenger.of(context)`\n- [ ] Long-running sync / auth / import flows guard stale async writes\n- [ ] No `ref.watch` inside notifier method body — `ref.watch` in `build()` only; `ref.read` in callbacks\n\n### T2 — Network / E2E / Stream / Showcase / Route\n\n- [ ] Source-of-truth fetch after mutation when backend generates / normalizes / reorders / derives values\n- [ ] Observer + writer E2E proof present for shared / realtime / collaborative state\n- [ ] All `ValueKey` from central `AppWidgetKeys` registry — no inline string `ValueKey('...')`\n- [ ] E2E entrypoint deterministic (`lib/main_dev.dart` or equivalent); test overrides isolated from `main.dart`\n- [ ] GoRouter redirect logic in pure `resolveAppRedirect(...)`, matrix-tested; nullable by-id provider for route params with fallback UI; call sites use generated typed route helpers\n- [ ] `startShowCase()` receives full ordered `ShowcaseKeys.*Tour` list; `ProviderSubscription` stored and closed in `disposeShowcase()`\n- [ ] Cross-runtime constants / schema / function contracts have drift tests\n- [ ] No `MediaQuery.withClampedTextScaling` in `MaterialApp` builder\n\n## Recap\n\n1. `dart analyze` from package root, never `flutter analyze`. Plugin wired in `analysis_options.yaml plugins:`, never `pubspec.yaml`.\n2. No `_buildXxx()`. No private widget classes extending Stateless / Stateful / Consumer / Hook. Public + `@visibleForTesting` if file-internal. `_FooState extends State<Foo>` stays private.\n3. `if (!ref.mounted) return;` after EVERY `await` in notifiers and repositories. `if (!context.mounted) return;` after EVERY `await` in widgets and `State`. Never bare `if (mounted)`. **Inside `finally` blocks**, use `if (ref.mounted) { ... }` guard form, never `if (!ref.mounted) return;`.\n4. Every mutation method inits deps via `_ensureRepository()` / `_ensureDependencies()`. Never rely on `build()` / `_init()` timing.\n5. `sealed class` with Freezed, never `abstract class`. Dart native `switch`, never `.when()` / `.map()`.\n6. No prop-drilling. Child widgets watch providers directly. No entity / state / notifier as constructor params.\n7. Shared behavior across 2+ classes → `mixin XxxMixin on Y`. No copy-paste sharing.\n8. Storage SDK (Hive, SharedPreferences, secure_storage, `dart:io`, `path_provider`) lives in `Local<X>Datasource`. Notifiers and widgets never import storage SDKs directly.\n9. Primitives → `core/extensions/`. SSOT. Inline forbidden. Missing? Add to barrel, then call. **Domain never imports `core/extensions/`** — entity getter (one-off) or VO (cross-entity).\n10. Domain primitives with unit / currency / measure / identity → sealed Freezed VO in `/domain/`. See [value-objects.md](references/value-objects.md).\n11. Typed GoRouter route classes are the navigation SSOT. Call generated route helpers directly; local modal helpers own sheet/dialog presentation and dismissal.","tags":["building","flutter","apps","sgaabdu4","agent-skills","ai-agents","clean-architecture","dart","freezed","riverpod","state-management"],"capabilities":["skill","source-sgaabdu4","skill-building-flutter-apps","topic-agent-skills","topic-ai-agents","topic-clean-architecture","topic-dart","topic-flutter","topic-freezed","topic-riverpod","topic-state-management"],"categories":["building-flutter-apps"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sgaabdu4/building-flutter-apps","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sgaabdu4/building-flutter-apps","source_repo":"https://github.com/sgaabdu4/building-flutter-apps","install_from":"skills.sh"}},"qualityScore":"0.455","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 10 github stars · SKILL.md body (21,625 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:08:13.457Z","embedding":null,"createdAt":"2026-05-18T13:13:42.064Z","updatedAt":"2026-05-18T19:08:13.457Z","lastSeenAt":"2026-05-18T19:08:13.457Z","tsv":"'/data/models':861 '/domain':855,1969,2043,2452 '/domain/values':387,798 '/flutter/flutter/issues/184190)).':139 '/plugin':1667,1672 '/plugins':1707 '/put/delete':532 '/reload-plugins':1683 '0':606,1640,1790,1947 '1':47,98,609,1595,2254 '1.11.0':1431 '10':517,2440 '11':572,2456 '12':772,776 '13':937 '17.2.3':1397 '184190':136 '2':61,140,482,743,899,1612,1896,2270,2380 '2.15.0':1409 '2.19.3':1429 '2.3.4':1430 '3':81,175,1631,2293 '3.1.0':1387 '3.2.5':1386 '3.3':1211 '3.3.1':1377 '4':219,1641,2330 '4.0.2':1378 '4.0.3':1379 '4.3.0':1398 '5':252,2345 '5.0.2':1415 '6':277,2359 '6.13.0':1408 '60':663 '7':361,2376 '8':407,2391 '9':472,2414 'abstract':371,1231,1518,1520,1523,1536,1549,2351 'access':545 'account':1188 'across':506,683,1895,2379 'activ':8,16,1686 'ad':1956 'ad-hoc':1955 'add':1627,1669,1703,1715,2421 'ago':665 'allow':433 'alreadi':1603 'alway':72,203,1760 'amountc':1091,1998 'analysis-options.md':1344 'analysis_options.yaml':46,1331,1346,1624,2266 'analyz':50,84,101,107,129,892,1333,1342,1618,1638,1650,1788,2256,2262 'annot':388,1374,1385,1968 'api':1458 'app':4,15,32,732,1677,1681,1724,1728 'app-specif':731 'app_localizations.dart':357 'appear':480 'appli':742,896 'apploc':279,1248 'appshowcasetarget':1146 'appwidgetkey':1160,2181 'arb':329,333,344,1249 'arb-dir':332,343 'arch':753,1095 'architectur':1064,1434 'architecture.md':1070,1113 'argumenterror.value':815 'ascurr':601,1941 'assert':820 'async':1025,2084,2132 'asyncnotifi':496,1018 'asyncnotifierprovid':163 'atom':445,1134,1139 'atomic-design.md':1143 'auth':2127 'auto':1660 'auto-instal':1659 'avoid':713 'await':178,189,1803,1813,2299,2309 'backend':2161 'bare':902,1819,1994,2315 'barrel':596,2423 'base':1528 'bash':1561 'behavior':479,997,1894,2378 'behind':548 'bind':301,1860 'blind':893 'block':55,2320 'bodi':811,2139 'boundari':652,848,907,2003,2032 'box':889,1183 'box.get':531 'box.get/put/delete':530 'bridg':871 'bucket':698 'build':2,13,30,168,309,464,1262,1406,1564,1573,1575,1582,1587,1589,1675,1679,1722,1726,2109,2142,2342 'build.yaml':45,1042 'buildcontext':584 'builder':952,1396,2252 'buildhead':1646 'building-flutter-app':1,12,29,1674,1678,1721,1725 'buildxxx':226,1834,2272 'bulk':1221 'by-id':2208 'cach':455,471,2097 'calendar':659,671,697,1953 'calendar-day':670 'calendardaysbefor':618 'call':520,553,598,740,2118,2218,2425,2465 'callback':438,2146 'cancel':1026,2088 'cannot':1742 'capabl':1215 'capit':586,600,1939 'capitalize/truncate/titlecase/initials/format':1303 'captur':1177 'case':274,1327 'catch':919,1497 'ce':562,1422,1424,1427,1910 'central':2180 'chain':314,1869,1951 'chang':37,873 'changenotifierprovid':164 'check':1643 'checklist':70 'child':413,2364 'children':1883 'clamp':590,602,622,1289,1942,1960 'clamp/pluralized/ascurrency/percent/tofixed':1307 'class':224,229,364,372,483,883,1233,1390,1507,1519,1522,1525,1527,1529,1531,1533,1535,1538,1545,1551,1839,1897,2276,2347,2352,2381,2460 'classifi':1198 'claud':1665 'claus':491,1326 'clean':1584 'cli':1690,1711 'close':2235 'code':25,36,1002,1412,1559,1666 'codegen':144,396,1054,1382,1874 'codex':1689,1691,1695,1700,1706 'cold':1109 'cold-start':1108 'collabor':2175 'collis':857 'column':1282 'command':1662 'comment':719 'common':1348 'common-patterns.md':1358 'compon':676 'comput':149,460,1270,2105 'config':327 'confirm':1636 'conflict':173,1569,1578,1592 'const':1265,1647 'constant':317,635,2241 'constructor':430,431,918,1266,1892,2017,2082,2374 'consum':468,1843,2280 'consumerst':446,2103 'consumerstatefulwidget':235 'consumerwidget':234 'contain':807 'context':963,967,2122 'context.go':1105 'context.l10n':304,1863 'context.l10n.somekey':315,1870 'context.mounted':196,205,1809,2305 'continu':95 'contract':1163,1543,2244 'control':2091 'convent':250 'convers':1081 'convert':703,845,2029 'copi':113,292,503,930,1596,1906,2052,2388 'copilot':1710,1712,1718 'copy-past':502,1905,2387 'copywith':853,1038,2041 'core':1360,1365,1451,1973 'core/extensions':574,593,750,1314,1937,2416,2429 'core/widgets':1141 'corrupt':890 'cost':1263 'crash':1194,1343,1557 'crashlyt':1191 'crashlytics.md':1212 'creat':2060 'critic':96 'cross':769,1085,2239,2438 'cross-ent':768,1084,2437 'cross-runtim':2238 'ctor':874 'currenc':588,790,1984,2445 'current':641,650 'current-day':649 'custom':929,2051 'da':1446,1448 'dart':24,40,49,83,100,166,339,377,538,568,891,1169,1332,1463,1562,1571,1580,1585,1633,1637,1649,1763,1787,1916,1978,2255,2353,2398 'dart-mcp-e2e-testing.md':1178 'dart-patterns-records.md':1329 'data':887,1245,1389,1447,1455,1974 'data/notifier/import':847,2031 'datasourc':151,298,524,551,1060,1457,1487,1506,1541,1930,2405 'date':675,688,1949 'dateformat':1312 'datetim':577,708,1300 'datetime.now':610,612 'datetime.timestamp':614 'datetimex':646,668 'datetimex.nowlocal':615,617 'datetimex.nowutc':1944 'day':651,664,672,682 'daystart':457,2099 'debounc':1352 'declar':1050,1399 'deep':1106 'deep-linking.md':1115 'default':337 'defer':2083 'defin':946 'definit':973 'delet':172,1568,1577,1591,2062 'delete-conflicting-output':171,1567,1576,1590 'dep':752,2066,2335 'deriv':454,470,758,2096,2165 'design':1137 'determinist':1243,2189 'diagnost':134 'differ':611 'dir':334,345,353 'direct':417,1886,2368,2413,2469 'directori':360,544 'disabl':395,403 'disk':895 'dismiss':985,2477 'dispatch':1295,2114 'disposeshowcas':2237 'distanc':1076,1990 'distancemet':904,1089,1996 'domain':78,746,754,757,778,784,819,843,868,924,928,1061,1083,1096,1130,1444,1460,1478,1482,1504,1964,1980,2024,2033,2050,2426,2441 'domain-mean':783 'doubl':580,786,903,1088,1305,1995 'drift':2246 'drill':411,1882,2363 'driver':1168 'drop':132 'dst':685 'dst-sensit':684 'durat':582,681,1308 'dynam':262,267,1850,1854 'e.g':492 'e2e':1171,1776,2149,2169,2187 'earli':1831 'early-return':1830 'email':1078,1093,1992,2000 'emit':9,26,62,1781 'enabl':1693,1697 'enforc':988,1753 'ensuredepend':2069,2338 'ensurerepositori':1024,2068,2337 'entir':400 'entiti':425,747,760,770,844,869,900,906,925,1033,1041,1062,1069,1086,1461,1470,1479,1888,1965,2002,2025,2034,2370,2430,2439 'entrypoint':2188 'equival':2192 'error':58,756,1098,1192,1197 'event':1162 'event-contract':1161 'everi':35,146,177,188,284,739,1802,1812,2089,2298,2308,2331 'except':1490,1851 'execut':624 'exempt':251,1848 'exit':1639,1789 'expand':1278 'experiment':1056 'explicit':808,1044 'extend':231,245,1510,1840,2277,2289 'extens':745,1292,1320 'extensions-utilities.md':774,1315 'extensions.dart':595,597 'extract':220,484 'facad':1195 'face':287,323 'factori':805,823,841,927,2012,2021,2026,2036 'failur':1495 'fake':1158,1242 'fallback':996,1255,1356,2216 'famili':153,1052,1878 'featur':1452,1453,1692,1696 'fetch':1124,2157 'field':458,933,1187,2101 'file':41,240,330,349,540,1250,1740,1925,2286 'file-intern':239,2285 'fill':65,1758,1765,1772 'filled-in':64 'final':208,275,302,1232,1524,1532,1550,1823,1861,2319 'fire':1228 'fire-and-forget':1227 'first':706,1417,2078 'first-run':1416 'fix':737 'flag':1652 'flexibl':1279 'flight':19,69,1757 'flow':2129 'flutter':3,14,31,89,106,121,128,135,249,535,565,1167,1210,1371,1425,1465,1485,1605,1613,1676,1680,1723,1727,1792,1913,1977,2261 'flutter-optimizations.md':1273 'fluttererror.onerror':1205 'foo':230 'foostat':244,2288 'forbidden':512,604,1945,2028,2419 'forget':1230 'form':212,1350,1826,2325 'format':591,620,793,1309 'format/diff/timeago/startofday':1301 'freez':366,374,381,389,402,795,1032,1383,1384,1547,1967,2023,2045,2349,2449 'freezed-sealed.md':1047 'freezedmapoptions.none':391 'freezedwhenoptions.none':393 'fromjson':1036 'full':2227 'function':2243 'futur':1235 'future.microtask':2086 'futureprovid':158 'gate':5,33,1112 'gen':281,1252 'gen-l10n':280,1251 'generat':338,956,975,1376,1413,1428,1560,2046,2162,2221,2466 'generateadapt':881 'get':666,1635 'getter':761,2431 'github.com':138 'github.com/flutter/flutter/issues/184190)).':137 'go':950,962,1392,1394 'goe':1927 'gorout':940,1101,2198,2458 'graph':1436 'guard':176,187,211,809,1325,1825,2130,2324 'guid':1419 'guidanc':1735 'guidance-on':1734 'hand':851,2039 'hand-written':850,2038 'handl':450 'hardcod':290 'helper':227,640,643,669,673,694,958,976,981,993,1219,1299,1555,2224,2468,2472 'hive':528,561,856,858,932,1180,1421,1423,1426,1909,2394 'hive-persistence.md':912,1189 'hive.box':533 'hive.openbox':529 'hoc':1957 'hold':862 'hook':1203,1657,1663,1694,1699,1745,1844,2281 'hookconsumerwidget':237 'hooks/hooks.copilot.json':1729 'hooks/hooks.json':1688,1709 'hookwidget':236 'http':1117 'id':324,435,1128,1131,1322,2210 'ident':792,1986,2447 'ihttpservic':1065 'immut':434,1388 'implement':1513 'import':356,560,749,755,1097,1466,1486,1920,1966,2128,2410,2428 'init':1029,2065,2334,2343 'inlin':576,621,1933,1959,2184,2418 'insid':198,207,971,1822,2136,2318 'instal':1661,1673,1708,1720,1732,1751 'instanc':428 'instanti':1516 'int':579,787,1090,1304,1997 'integr':1172 'intent':712,729 'interfac':552,1217,1521,1530,1537 'intern':241,2287 'intl':1313 'io':539,569,1917,2399 'isol':2195 'isolate.current.adderrorlistener':1207 'iter':583 'json':268,1046,1404,1410,1856 'keep':938,968 'keepal':1053 'key':439,1866 'key/id/limit/threshold':1962 'l10n':282,303,326,1253,1862 'l10n.somekey':312 'larg':1268 'layer':1063 'layout-diagnostics.md':1290 'layoutbuild':1275 'lazili':2070 'leaf':444 'legaci':1209 'let':2044 'lib':130,1450,1512,1515 'lib/l10n':335 'lib/main_dev.dart':2190 'lifecycl':449,1151 'link':1107 'lint':91,123,125,401,466,707,914,987,1337,1607,1609,1615,1794,1796 'list':1012,1269,1351,2231 'listview.builder':1267 'liter':630,715,726,1963 'live':521,547,644,866,1498,1621,1898,2402 'load':1738 'local':348,463,523,550,658,687,696,705,722,977,991,1254,1432,1459,1865,1929,1952,2108,2404,2470 'localization.md':1259 'log':1176 'logic':2200 'long':2124 'long-run':2123 'lr':1437 'magic':629,714 'main.dart':1475,2197 'manag':1381 'manual':156,1876 'map':265,383,390,404,999,1066,1468,1852,2358 'mapper':870 'mark':238 'marketplac':1668,1702,1714 'match':375,1324 'materialapp':2251 'matrix':2205 'matrix-test':2204 'matter':1754 'may':447 'mcp':1170 'mean':785 'measur':791,1985,2446 'mediaquery.withclampedtextscaling':2249 'mermaid':1435 'meter':802,2008 'method':399,1020,2059,2138,2333 'migrat':1185 'miss':2420 'mixin':475,487,493,501,516,1214,1517,1534,1901,1903,2382 'mixins.md':1223 'mock':1159 'modal':992,2471 'model':859,1039,1067,1456,1469,1481 'modifi':1508,1509 'molecul':1135 'money':1077,1991 'mount':202,1821,2317 'move':631 'must':691,702,806,1651 'mutat':1019,1055,1126,1770,2057,2058,2159,2332 'name':499,634,839,2019 'namespac':1556 'nativ':378,2354 'navig':944,954,986,1111,1349,2463 'navigator.pop':983 'network':1118,1775,2148 'networking.md':1132 'never':105,109,155,200,215,269,289,313,370,380,408,525,559,575,748,821,872,1480,1491,1502,1626,1829,2260,2268,2314,2326,2339,2350,2356,2409,2427 'non':321 'non-user-fac':320 'normal':2163 'notifi':180,295,427,507,527,556,1017,1028,1297,1472,1501,1769,1805,1890,1922,2056,2111,2137,2301,2372,2406 'notifier.build':2072 'notifierprovid':162 'now/diff/utc/timestamp':1950 'nowloc':648 'nowlocalstartofday':655 'nowutc':647 'null':1493 'nullabl':2207 'num':581,1306 'number':627 'numberformat':1311,1958 'numberformat.currency':619 'object':254,637,767,782,1073 'observ':2167 'obsess':1075 'one':736,763,2433 'one-off':762,2432 'op':541,585,1935 'oper':1222 'order':878,2228 'organ':1136 'outer':751 'output':174,347,352,1007,1570,1579,1593 'output-dir':351 'output-localization-fil':346 'outsid':1280,1284,1511,1514,1936 'overflow':1277 'overrid':2194 'own':2112 'ownership':727 'p':1438 'packag':53,103,1368,1976,2258 'param':432,875,1355,2214,2375 'parse/format':1310 'pass':424 'passthrough':822,923 'past':504,1907,2389 'path':111,542,570,970,1918,1970,2400 'path-scop':110 'pattern':1323,1357 'per':1655 'per-tool':1654 'percent':589 'perform':1261 'performance.md':1271 'persist':1184,1433 'persisted/server':689 'pin':1341 'placehold':1256 'platformdispatcher.instance.onerror':1206 'plugin':127,133,1334,1611,1619,1625,1698,1701,1713,1719,1750,2263,2267 'plural':603,1257,1943 'posit':1283 'pre':18,68,1339,1756 'pre-flight':17,67,1755 'pre-releas':1338 'prefer':564,1912 'present':1439,1471,1975,2171,2475 'preview':1239,1241,1244 'primit':441,573,779,840,863,897,926,1074,1087,1934,1981,2020,2035,2415,2442 'privat':248,801,1837,2007,2274,2292 'project':117,1600 'promot':1142 'proof':2170 'prop':410,442,1881,2362 'prop-dril':409,1880,2361 'provid':147,157,416,453,461,543,571,1049,1872,1877,1885,1919,2095,2106,2211,2367,2401 'provider-deriv':452,2094 'providercontainer.test':1156 'providersubscript':1150,2232 'pub':1634 'public':223,804,835,916,920,2013,2015,2282 'pubspec.yaml':44,1630,2269 'pure':1462,1553,2202 'purpos':1370 'push':966 'put':328 'r':1440,1442,1445 'raw':623,723,799,803,836,917,1730,1961,2005,2009,2016 'read':28,415,1008,1010,1016,1867,2075 'readme.md':1364,1367 'realtim':2174 'recap':2253 'receiv':2226 'reconstruct':674 'record':1317 'recover':1196 'redirect':800,837,921,1104,2006,2049,2199 'ref.listen':421,1023 'ref.mounted':185,214,217,1799,1828,2295,2323,2328 'ref.ondispose':2087 'ref.read':420,1021,2144 'ref.watch':419,1022,2135,2140 'refer':1013 'references/analysis-options.md':1345 'references/analysis_options.yaml':114,115,1347,1597,1598 'references/architecture.md':1071,1114 'references/atomic-design.md':1144 'references/common-patterns.md':1359 'references/crashlytics.md':1213 'references/dart-mcp-e2e-testing.md':1179 'references/dart-patterns-records.md':1330 'references/deep-linking.md':1116 'references/extensions-utilities.md':775,1316 'references/flutter-optimizations.md':1274 'references/freezed-sealed.md':1048 'references/hive-persistence.md':913,1190 'references/layout-diagnostics.md':1291 'references/localization.md':1260 'references/mixins.md':1224 'references/networking.md':1133 'references/performance.md':1272 'references/riverpod-codegen.md':1058 'references/services-and-singletons.md':1238 'references/showcase-tours.md':1153 'references/state-management.md':1031 'references/testing.md':1166 'references/value-objects.md':911,1100,2455 'references/widget-previews.md':1247 'regist':882,1743 'registri':2182 'reject':830 'releas':1340 'reli':2340 'renderflex':1276 'reorder':2064,2164 'repeat':657 'replac':513 'replay':1148 'report':1193 'repositori':150,182,296,555,1059,1441,1467,1476,1540,1807,1931,2303 'requir':20,406,710 'resolveappredirect':2203 'rest':1119 'retir':1186 'retri':1218 'retrymixin':494 'return':186,197,206,218,1477,1492,1800,1810,1832,2079,2296,2306,2329 'risk':832 'riverpod':124,142,143,467,1051,1336,1372,1373,1375,1608,1795,1873 'riverpod-codegen.md':1057 'rng':1220 'root':54,104,118,1601,2259 'rout':941,947,957,969,972,990,1103,1354,1403,1779,2152,2213,2223,2459,2467 'route-param-fallback':1353 'router':951,1393,1395 'routing/lookup':437 'row':1005,1281 'rule':97,771 'run':48,92,165,167,1418,1563,1572,1581,1586,1632,1682,1747,2125 'runner':169,1407,1565,1574,1583,1588 'runtim':1744,2240 'runzonedguard':1208 's.substring':608 'safe':1402 'saniti':1642 'scaffoldmessenger.of':2121 'scale':1288 'scanner':1748 'schema':2242 'scope':112 'screen':1473 'sdk':519,2393 'sdks':2412 'seal':363,794,1034,1526,1544,2346,2448 'secur':536,566,1914,2396 'see':773,909,2453 'seed':2080 'select':1258,1264 'selector':1175 'semant':639,667,980,1174 'sensit':686 'serial':1411 'serializ':1405 'servic':152,510,1225,1542 'services-and-singletons.md':1237 'session':1687 'set':355,2063 'setup':93,1594 'sgaabdu4/building-flutter-apps':1670,1704,1716 'share':505,563,1893,1911,2173,2377,2390 'sharedprefer':534,2395 'sheet/dialog':2474 'sheets/dialogs':978 'ship':885 'showcas':1145,1778,2151 'showcase-tours.md':1152 'showcasekey':1149,2229 'showcaseview':1414 'signatur':1236 'silent':131,888 'singleton':1226 'site':741,2219 'sizedbox':1648 'skill':7,90,122,1606,1614,1731,1793 'skill-building-flutter-apps' 'slug':1079 'smell':908,1094 'snackbar':1294,2113 'snackbarutil':1293 'snackbarutils.show':2119 'somerout':961,965 'sourc':456,1121,1664,2098,2154 'source-of-truth':1120,2153 'source-sgaabdu4' 'specif':257,733 'ssot':735,945,1363,2417,2464 'stack':1285,1361,1366 'stale':2131 'start':1110 'startofday':616 'startshowcas':1147,2225 'state':148,193,199,246,369,412,426,469,1380,1768,1817,1842,1846,1889,2055,2076,2176,2279,2290,2313,2371 'state-management.md':1030 'statefulwidget':233 'stateless':1554,1841,2278 'statelesswidget':232 'statenotifierprovid':161 'stateprovid':160 'stay':247,2291 'storag':518,537,567,1558,1915,1926,2392,2397,2411 'store':700,2233 'stream':154,1777,2150 'streamprovid':159 'string':266,288,316,578,625,788,1092,1302,1853,1999,2185 'subclass':1847 'subscript':2090 'subtract':680 'suffix':497,1902 'suppress':716 'switch':379,2355 'symbol':1199 'sync':1027,2071,2126 't0':71,1759,1786 't1':73,1766,2054 't2':74,1773,2147 'test':1155,1164,1173,2193,2206,2247 'testing.md':1165 'text':1287 'text-scal':1286 'three':1202 'three-hook':1201 'throw':814,818,1488 'time':642,724,2344 'timeago':587,599,1940 'timer':2092 'timestamp':690,701 'timezon':711 'todaystart':2100 'tojson':1037 'token':1138 'tool':1656,1658 'top':307 'topic-agent-skills' 'topic-ai-agents' 'topic-clean-architecture' 'topic-dart' 'topic-flutter' 'topic-freezed' 'topic-riverpod' 'topic-state-management' 'touch':80,1015,1771,1780 'touppercas':607,1948 'tour':1420,2230 'toutc':613 'transport':1127 'tri':1496 'trigger':998 'truth':1123,2156 'turn':1785 'type':258,594,876,936,939,989,995,1102,1321,1401,1489,2222,2457 'type-saf':1400 'typeadapt':1181 'typeid':1182 'ui':291,1979,2217 'unawait':1234 'uncontrolledproviderscop':1157 'union':367,1035,1391,1548 'unit':789,1080,1983,2444 'unknown':260 'unless':350 'updat':738,2061 'upload':1200 'use':99,141,209,253,271,278,311,362,459,473,692,744,979,1749,1824,1938,2104,2220,2321 'user':286,322,886 'user-fac':285 'user.fromprimitives':2027 'utc':693 'v':276,826,828 'v.isfinite':817 'v.isnan':813 'valid':2011 'valu':261,270,273,465,636,766,781,1072,1858,2110,2166 'value-objects.md':910,1099,2454 'valuekey':2178,2186 'verbatim':10,27 'version':1362,1369 'via':759,2067,2081,2336 'visiblefortest':243,1298,2283 'vo':796,901,915,935,1989,2004,2014,2436,2450 'vos':385,865 'vs':1040,1129,1216 'warn':60 'watch':170,1566,1884,2366 'widget':191,221,242,294,300,414,508,558,1140,1154,1474,1645,1815,1838,1845,1859,1924,2115,2275,2311,2365,2408 'widget-previews.md':1246 'widget_previews.dart':1240 'window':660,1954 'wire':87,120,1204,1335,1604,1797,2264 'wrap':777,1987 'write':22,1001,1644,1764,2133 'writer':2168 'written':341,852,2040 'x':1318,1454 'x._unit':827 'x.unit':824 'xxxmixin':2383 'y':1319,2385 'yield':1783 'zero':1972","prices":[{"id":"5f89de7d-287d-42cc-afee-fe7d840f3cef","listingId":"d66f3e51-cae3-4918-a216-d8449e9bf7e2","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sgaabdu4","category":"building-flutter-apps","install_from":"skills.sh"},"createdAt":"2026-05-18T13:13:42.064Z"}],"sources":[{"listingId":"d66f3e51-cae3-4918-a216-d8449e9bf7e2","source":"github","sourceId":"sgaabdu4/building-flutter-apps","sourceUrl":"https://github.com/sgaabdu4/building-flutter-apps","isPrimary":false,"firstSeenAt":"2026-05-18T13:13:42.064Z","lastSeenAt":"2026-05-18T19:08:13.457Z"}],"details":{"listingId":"d66f3e51-cae3-4918-a216-d8449e9bf7e2","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sgaabdu4","slug":"building-flutter-apps","github":{"repo":"sgaabdu4/building-flutter-apps","stars":10,"topics":["agent-skills","ai-agents","clean-architecture","dart","flutter","freezed","riverpod","state-management"],"license":"mit","html_url":"https://github.com/sgaabdu4/building-flutter-apps","pushed_at":"2026-05-14T11:17:19Z","description":"Flutter clean architecture skill for AI agents. Riverpod 3.x codegen, Freezed 3.x sealed classes, and GoRouter patterns.","skill_md_sha":"805db4782b2f657d1935ed82c1527f2dbc1ea48f","skill_md_path":"SKILL.md","default_branch":"master","skill_tree_url":"https://github.com/sgaabdu4/building-flutter-apps"},"layout":"root","source":"github","category":"building-flutter-apps","frontmatter":{"name":"building-flutter-apps","license":"MIT","description":">-"},"skills_sh_url":"https://skills.sh/sgaabdu4/building-flutter-apps"},"updatedAt":"2026-05-18T19:08:13.457Z"}}