跳到正文
cccskills
免费在 GitHub 公开

flutter-atomic-components

Use when adding or reusing Flutter UI - organize widgets as atoms, molecules, and organisms in a shared library and never hand-roll a component that already exists

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(1)

  • SKILL.md4.1 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Flutter Atomic Components

Overview

The same atomic-design discipline the web app follows applies to Flutter: build a shared component library organized by level and compose screens from it. This keeps the app visually consistent and makes screens small.

Core principle: Reuse before you build. Before writing any button/card/chip/input/list-row, search the component library — hand-rolling a duplicate is a review-blocking defect.

The Levels

LevelWhatFlutter example
AtomSmallest reusable UI, no app logicAppButton, AppTextField, StatusChip, Avatar
MoleculeA few atoms forming a unitTaskCard (title + chip + avatar), SearchBar
OrganismSection built from molecules/atomsTaskList, BoardColumn, AppBarWithActions
ScreenRoute wiring organisms to stateTaskBoardScreen

Library lives under lib/ui/core/{atoms,molecules,organisms} — the official Flutter architecture layout — alongside lib/ui/features/<feature>/ for screen-specific composition; follow the app's existing layout if it differs (e.g. a flat lib/ui/atoms).

INVENTORY.md

lib/ui/core/INVENTORY.md: header One line per component: level · name · purpose · variants, one bullet per component, added in the same commit that creates or meaningfully changes it. Check it before building anything — it's faster than grepping the tree and it's the thing the next task's agent will actually read. If the repo has no component library or theme yet, load mobile-design-system-foundation first.

Rules

  • Before creating a component, check INVENTORY.md / grep the library. If an atom exists, use it. If it almost fits, extend it backward-compatibly — don't fork a near-duplicate.
  • Place new components at the correct level. A button is an atom; a card composed of atoms is a molecule. A "component" that fetches data is not a component — split the presentation out.
  • Atoms take data + callbacks, never talk to services. AppButton({required this.label, required this.onPressed}). State/data flows from the screen down.
  • Atoms carry no outer margin of their own — spacing between atoms is the parent's job (a Row/Column with spacing:, or explicit SizedBox/padding at the call site), so the same atom composes correctly in every context without fighting a built-in margin.
  • Style through the theme (see flutter-widget-architecture) so every instance of an atom looks identical.
  • Changing a shared atom: grep every call site first; keep the change backward-compatible or update all callers in the same task. The build must stay green.

Worked Example

Task: "add a priority badge to task cards." Wrong: add a Container with a colored label inline in TaskCard. Right:

  1. Check INVENTORY.md / grep atoms → no PriorityBadge, but there is a StatusChip atom. Priority is distinct enough → add a PriorityBadge atom next to it, themed the same way.
  2. Compose it into the TaskCard molecule.
  3. Both the badge atom and the card get a widget test.
  4. Add the PriorityBadge line to INVENTORY.md in the same commit.

Now every screen showing a task card gets the badge for free, consistently.

Common Mistakes

  • Inline Container/Text styling that reinvents an existing atom.
  • A component with a network/service call inside → not a component.
  • New component dumped at the wrong level (an organism where an atom belongs).
  • Breaking a shared atom's constructor without updating callers.
  • A new component added to the library with no INVENTORY.md line.
  • An atom with a built-in outer margin, so it looks right in one layout and wrong in the next.

Red Flags

  • Two screens render visually identical buttons built differently.
  • A "widget" imports a repository or http client.
  • Copy-pasted styled Containers across screens.
  • lib/ui/core/ (or the repo's component folder) with no INVENTORY.md.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1172026年10月21日 更新

Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1172026年10月21日 更新

Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1172026年10月21日 更新

Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1172026年10月21日 更新

How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1172026年10月21日 更新

Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1172026年10月21日 更新

查看 makifbaysal 的全部技能

报告此技能的问题