Agent SkillsMimicHunterZ/PocketMind › flutter-layout

flutter-layout

GitHub

指导使用Flutter布局组件和约束系统构建健壮、响应式的用户界面,包括选择布局策略、应用约束规则及实现自适应设计。

.claude/skills/flutter-layout/SKILL.md MimicHunterZ/PocketMind

Trigger Scenarios

需要构建Flutter UI界面 解决Flutter布局约束问题 实现响应式或自适应布局

Install

npx skills add MimicHunterZ/PocketMind --skill flutter-layout -g -y
More Options

Non-standard path

npx skills add https://github.com/MimicHunterZ/PocketMind/tree/master/.claude/skills/flutter-layout -g -y

Use without installing

npx skills use MimicHunterZ/PocketMind@flutter-layout

指定 Agent (Claude Code)

npx skills add MimicHunterZ/PocketMind --skill flutter-layout -a claude-code -g -y

安装 repo 全部 skill

npx skills add MimicHunterZ/PocketMind --all -g -y

预览 repo 内 skill

npx skills add MimicHunterZ/PocketMind --list

SKILL.md

Frontmatter
{
    "name": "flutter-layout",
    "metadata": {
        "model": "models\/gemini-3.1-pro-preview",
        "last_modified": "Fri, 27 Feb 2026 00:24:00 GMT"
    },
    "description": "How to build your app's layout using Flutter's layout widgets and constraint system"
}

Goal

Constructs robust, responsive Flutter user interfaces by composing layout widgets, managing constraints, and implementing adaptive design patterns. Assumes the target environment has the Flutter SDK installed and the user is familiar with Dart syntax and state management fundamentals.

Instructions

  1. Determine Layout Strategy (Decision Logic) Analyze the UI requirements and select the appropriate base layout widgets using the following decision tree:

    • Is the content strictly 1-Dimensional?
      • Horizontal arrangement -> Use Row.
      • Vertical arrangement -> Use Column.
    • Does the content need to overlap (Z-axis)?
      • Yes -> Use Stack with Positioned or Align children.
    • Does the content exceed the screen size?
      • Yes, 1D list -> Use ListView.
      • Yes, 2D grid -> Use GridView.
      • Yes, custom scroll effects -> Use CustomScrollView with Slivers.
    • Does the layout need to adapt to screen size changes?
      • Yes -> Use LayoutBuilder or MediaQuery.
  2. Apply the Golden Rule of Constraints Enforce Flutter's core layout rule: Constraints go down. Sizes go up. Parent sets position. When a widget requires a specific size, ensure its parent allows it. Use ConstrainedBox to inject specific constraints, but remember it only adds to the parent's constraints.

    // Example: Forcing a specific size within a flexible parent
    Center(
      child: ConstrainedBox(
        constraints: const BoxConstraints(
          minWidth: 70,
          minHeight: 70,
          maxWidth: 150,
          maxHeight: 150,
        ),
        child: Container(
          color: Colors.blue,
          width: 1000, // Will be constrained to 150 (max)
          height: 10,  // Will be constrained to 70 (min)
        ),
      ),
    )
    
  3. Implement Adaptive Layouts For screens that must support both mobile and tablet/desktop form factors, implement a LayoutBuilder to branch the UI logic based on available width.

    class AdaptiveScreen extends StatelessWidget {
      const AdaptiveScreen({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SafeArea(
            child: LayoutBuilder(
              builder: (context, constraints) {
                if (constraints.maxWidth > 600) {
                  return _buildWideLayout();
                } else {
                  return _buildNarrowLayout();
                }
              },
            ),
          ),
        );
      }
    
      Widget _buildWideLayout() {
        return Row(
          children: [
            const SizedBox(width: 250, child: Placeholder()), // Sidebar
            Container(width: 1, color: Colors.grey), // Divider
            const Expanded(child: Placeholder()), // Main Content
          ],
        );
      }
    
      Widget _buildNarrowLayout() {
        return const Column(
          children: [
            Expanded(child: Placeholder()), // Main Content
          ],
        );
      }
    }
    
  4. Compose Flex Layouts (Rows and Columns) When using Row or Column, manage child sizing using Expanded (forces child to fill available space) or Flexible (allows child to be smaller than available space).

    Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        const Icon(Icons.star),
        Expanded(
          flex: 2,
          child: Container(color: Colors.red, height: 50),
        ),
        Flexible(
          flex: 1,
          child: Container(color: Colors.blue, height: 50),
        ),
      ],
    )
    
  5. Gather Context STOP AND ASK THE USER: "What are the target devices (e.g., mobile, tablet, web) and specific breakpoint widths required for this layout?"

  6. Validate-and-Fix: Handle Unbounded Constraints Verify that no Expanded or Flexible widgets are placed inside unbounded parents (like ListView or SingleChildScrollView). If a RenderFlex overflow occurs, implement the following fix:

    // INCORRECT: Expanded inside a scrollable view causes unbounded height errors.
    // SingleChildScrollView(child: Column(children: [Expanded(child: Container())]))
    
    // CORRECT: Use a bounded height or remove Expanded.
    // Alternatively, use CustomScrollView with SliverFillRemaining:
    CustomScrollView(
      slivers: [
        SliverToBoxAdapter(child: HeaderWidget()),
        SliverFillRemaining(
          hasScrollBody: false,
          child: ExpandedContentWidget(),
        ),
      ],
    )
    

Constraints

  • Always wrap top-level screen content in a SafeArea to prevent overlap with system UI.
  • Never place an Expanded or Flexible widget inside a parent that provides unbounded constraints (e.g., SingleChildScrollView, ListView, or Row inside a horizontally scrolling view).
  • Do not use Container solely for padding; use the Padding widget for better performance.
  • Assume the user is using Material 3 (useMaterial3: true is default).

Version History

  • c1dc382 Current 2026-08-20 13:17

Same Skill Collection

.claude/skills/asset-image-subsystem/SKILL.md
.claude/skills/baoyu-danger-x-to-markdown/SKILL.md
.claude/skills/flutter-accessibility/SKILL.md
.claude/skills/flutter-app-size/SKILL.md
.claude/skills/flutter-architecture/SKILL.md
.claude/skills/flutter-concurrency/SKILL.md
.claude/skills/flutter-environment-setup-linux/SKILL.md
.claude/skills/flutter-environment-setup-macos/SKILL.md
.claude/skills/flutter-environment-setup-windows/SKILL.md
.claude/skills/flutter-http-and-json/SKILL.md
.claude/skills/flutter-localization/SKILL.md
.claude/skills/flutter-native-interop/SKILL.md
.claude/skills/flutter-plugins/SKILL.md
.claude/skills/flutter-routing-and-navigation/SKILL.md
.claude/skills/flutter-testing/SKILL.md
.claude/skills/flutter-theming/SKILL.md
.claude/skills/headless-scraping/SKILL.md
.claude/skills/moai-lang-flutter/SKILL.md
.claude/skills/mobile-ai-chat-client/SKILL.md
.claude/skills/mobile-note-sync-architecture/SKILL.md
.claude/skills/note-resource-catalog-reliability/SKILL.md
.claude/skills/note-resource-event-driven-architecture/SKILL.md
.claude/skills/pocketmind-context-architecture/SKILL.md
.claude/skills/skill-creator/SKILL.md
backend/.claude/skills/code-reviewer/SKILL.md
.claude/skills/flutter-animation/SKILL.md
.claude/skills/flutter-caching/SKILL.md
.claude/skills/flutter-databases/SKILL.md
.claude/skills/flutter-form/SKILL.md
.claude/skills/flutter-home-screen-widget/SKILL.md
.claude/skills/flutter-performance/SKILL.md
.claude/skills/flutter-platform-views/SKILL.md
.claude/skills/flutter-state-management/SKILL.md

Metadata

Files
0
Version
c1dc382
Hash
9daadb10
Indexed
2026-08-20 13:17

- 위키
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-08-25 10:30
浙ICP备14020137号-1 $방문자$