[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-flutter-flutter-build-responsive-layout":3,"mdc-29l128-key":31,"related-org-flutter-flutter-build-responsive-layout":1341,"related-repo-flutter-flutter-build-responsive-layout":1479},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":21,"repoUrl":22,"updatedAt":23,"license":24,"forks":25,"topics":26,"repo":27,"sourceUrl":29,"mdContent":30},"flutter-build-responsive-layout","build responsive layouts in Flutter","Use `LayoutBuilder`, `MediaQuery`, or `Expanded\u002FFlexible` to create a layout that adapts to different screen sizes. Use when you need the UI to look good on both mobile and tablet\u002Fdesktop form factors.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"flutter","Flutter (Google)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fflutter.png",[12,15,18],{"name":13,"slug":8,"type":14},"Flutter","tag",{"name":16,"slug":17,"type":14},"Mobile","mobile",{"name":19,"slug":20,"type":14},"UI Components","ui-components",2664,"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fagent-plugins","2026-07-15T05:22:32.504776",null,155,[],{"repoUrl":22,"stars":21,"forks":25,"topics":28,"description":24},[],"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fagent-plugins\u002Ftree\u002FHEAD\u002Fskills\u002Fflutter-build-responsive-layout","---\nname: flutter-build-responsive-layout\ndescription: Use `LayoutBuilder`, `MediaQuery`, or `Expanded\u002FFlexible` to create a layout that adapts to different screen sizes. Use when you need the UI to look good on both mobile and tablet\u002Fdesktop form factors.\nmetadata:\n  model: models\u002Fgemini-3.1-pro-preview\n  last_modified: Tue, 21 Apr 2026 20:17:40 GMT\n---\n# Implementing Adaptive Layouts\n\n## Contents\n- [Space Measurement Guidelines](#space-measurement-guidelines)\n- [Widget Sizing and Constraints](#widget-sizing-and-constraints)\n- [Device and Orientation Behaviors](#device-and-orientation-behaviors)\n- [Workflow: Constructing an Adaptive Layout](#workflow-constructing-an-adaptive-layout)\n- [Workflow: Optimizing for Large Screens](#workflow-optimizing-for-large-screens)\n- [Examples](#examples)\n\n## Space Measurement Guidelines\nDetermine the available space accurately to ensure layouts adapt to the app window, not just the physical device.\n\n*   **Use `MediaQuery.sizeOf(context)`** to get the size of the entire app window.\n*   **Use `LayoutBuilder`** to make layout decisions based on the parent widget's allocated space. Evaluate `constraints.maxWidth` to determine the appropriate widget tree to return.\n*   **Do not use `MediaQuery.orientationOf` or `OrientationBuilder`** near the top of the widget tree to switch layouts. Device orientation does not accurately reflect the available app window space.\n*   **Do not check for hardware types** (e.g., \"phone\" vs. \"tablet\"). Flutter apps run in resizable windows, multi-window modes, and picture-in-picture. Base all layout decisions strictly on available window space.\n\n## Widget Sizing and Constraints\nUnderstand and apply Flutter's core layout rule: **Constraints go down. Sizes go up. Parent sets position.**\n\n*   **Distribute Space:** Use `Expanded` and `Flexible` within `Row`, `Column`, or `Flex` widgets.\n    *   Use `Expanded` to force a child to fill all remaining available space (equivalent to `Flexible` with `fit: FlexFit.tight` and a `flex` factor of 1.0).\n    *   Use `Flexible` to allow a child to size itself up to a specific limit while still expanding\u002Fcontracting. Use the `flex` factor to define the ratio of space consumption among siblings.\n*   **Constrain Width:** Prevent widgets from consuming all horizontal space on large screens. Wrap widgets like `GridView` or `ListView` in a `ConstrainedBox` or `Container` and define a `maxWidth` in the `BoxConstraints`.\n*   **Lazy Rendering:** Always use `ListView.builder` or `GridView.builder` when rendering lists with an unknown or large number of items.\n\n## Device and Orientation Behaviors\nEnsure the app behaves correctly across all device form factors and input methods.\n\n*   **Do not lock screen orientation.** Locking orientation causes severe layout issues on foldable devices, often resulting in letterboxing (the app centered with black borders). Android large format tiers require both portrait and landscape support.\n*   **Fallback for Locked Orientation:** If business requirements strictly mandate a locked orientation, use the `Display API` to retrieve physical screen dimensions instead of `MediaQuery`. `MediaQuery` fails to receive the larger window size in compatibility modes.\n*   **Support Multiple Inputs:** Implement support for basic mice, trackpads, and keyboard shortcuts. Ensure touch targets are appropriately sized and keyboard navigation is accessible.\n\n## Workflow: Constructing an Adaptive Layout\n\nFollow this workflow to implement a layout that adapts to the available `BoxConstraints`.\n\n**Task Progress:**\n- [ ] Identify the target widget that requires adaptive behavior.\n- [ ] Wrap the widget tree in a `LayoutBuilder`.\n- [ ] Extract the `constraints.maxWidth` from the builder callback.\n- [ ] Define an adaptive breakpoint (e.g., `largeScreenMinWidth = 600`).\n- [ ] **If `maxWidth > largeScreenMinWidth`:** Return a large-screen layout (e.g., a `Row` placing a navigation sidebar and content area side-by-side).\n- [ ] **If `maxWidth \u003C= largeScreenMinWidth`:** Return a small-screen layout (e.g., a `Column` or standard navigation-style approach).\n- [ ] Run validator -> resize the application window -> review layout transitions -> fix overflow errors.\n\n## Workflow: Optimizing for Large Screens\n\nFollow this workflow to prevent UI elements from stretching unnaturally on large displays.\n\n**Task Progress:**\n- [ ] Identify full-width components (e.g., `ListView`, text blocks, forms).\n- [ ] **If optimizing a list:** Convert `ListView.builder` to `GridView.builder` using `SliverGridDelegateWithMaxCrossAxisExtent` to automatically adjust column counts based on window size.\n- [ ] **If optimizing a form or text block:** Wrap the component in a `ConstrainedBox`.\n- [ ] Apply `BoxConstraints(maxWidth: [optimal_width])` to the `ConstrainedBox`.\n- [ ] Wrap the `ConstrainedBox` in a `Center` widget to keep the constrained content centered on large screens.\n- [ ] Run validator -> test on desktop\u002Ftablet target -> review horizontal stretching -> adjust `maxWidth` or grid extents.\n\n## Examples\n\n### Adaptive Layout using LayoutBuilder\nDemonstrates switching between a mobile and desktop layout based on available width.\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\n\nconst double largeScreenMinWidth = 600.0;\n\nclass AdaptiveLayout extends StatelessWidget {\n  const AdaptiveLayout({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return LayoutBuilder(\n      builder: (context, constraints) {\n        if (constraints.maxWidth > largeScreenMinWidth) {\n          return _buildLargeScreenLayout();\n        } else {\n          return _buildSmallScreenLayout();\n        }\n      },\n    );\n  }\n\n  Widget _buildLargeScreenLayout() {\n    return Row(\n      children: [\n        const SizedBox(width: 250, child: Placeholder(color: Colors.blue)),\n        const VerticalDivider(width: 1),\n        Expanded(child: const Placeholder(color: Colors.green)),\n      ],\n    );\n  }\n\n  Widget _buildSmallScreenLayout() {\n    return const Placeholder(color: Colors.green);\n  }\n}\n```\n\n### Constraining Width on Large Screens\nDemonstrates preventing a widget from consuming all horizontal space.\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\n\nclass ConstrainedContent extends StatelessWidget {\n  const ConstrainedContent({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: ConstrainedBox(\n          constraints: const BoxConstraints(\n            maxWidth: 800.0, \u002F\u002F Maximum width for readability\n          ),\n          child: ListView.builder(\n            itemCount: 50,\n            itemBuilder: (context, index) {\n              return ListTile(\n                title: Text('Item $index'),\n              );\n            },\n          ),\n        ),\n      ),\n    );\n  }\n}\n```\n",{"data":32,"body":36},{"name":4,"description":6,"metadata":33},{"model":34,"last_modified":35},"models\u002Fgemini-3.1-pro-preview","Tue, 21 Apr 2026 20:17:40 GMT",{"type":37,"children":38},"root",[39,48,55,115,120,126,204,209,219,408,413,418,474,479,490,498,632,637,642,649,789,794,801,806,1118,1124,1129,1335],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"implementing-adaptive-layouts",[45],{"type":46,"value":47},"text","Implementing Adaptive Layouts",{"type":40,"tag":49,"props":50,"children":52},"h2",{"id":51},"contents",[53],{"type":46,"value":54},"Contents",{"type":40,"tag":56,"props":57,"children":58},"ul",{},[59,70,79,88,97,106],{"type":40,"tag":60,"props":61,"children":62},"li",{},[63],{"type":40,"tag":64,"props":65,"children":67},"a",{"href":66},"#space-measurement-guidelines",[68],{"type":46,"value":69},"Space Measurement Guidelines",{"type":40,"tag":60,"props":71,"children":72},{},[73],{"type":40,"tag":64,"props":74,"children":76},{"href":75},"#widget-sizing-and-constraints",[77],{"type":46,"value":78},"Widget Sizing and Constraints",{"type":40,"tag":60,"props":80,"children":81},{},[82],{"type":40,"tag":64,"props":83,"children":85},{"href":84},"#device-and-orientation-behaviors",[86],{"type":46,"value":87},"Device and Orientation Behaviors",{"type":40,"tag":60,"props":89,"children":90},{},[91],{"type":40,"tag":64,"props":92,"children":94},{"href":93},"#workflow-constructing-an-adaptive-layout",[95],{"type":46,"value":96},"Workflow: Constructing an Adaptive Layout",{"type":40,"tag":60,"props":98,"children":99},{},[100],{"type":40,"tag":64,"props":101,"children":103},{"href":102},"#workflow-optimizing-for-large-screens",[104],{"type":46,"value":105},"Workflow: Optimizing for Large Screens",{"type":40,"tag":60,"props":107,"children":108},{},[109],{"type":40,"tag":64,"props":110,"children":112},{"href":111},"#examples",[113],{"type":46,"value":114},"Examples",{"type":40,"tag":49,"props":116,"children":118},{"id":117},"space-measurement-guidelines",[119],{"type":46,"value":69},{"type":40,"tag":121,"props":122,"children":123},"p",{},[124],{"type":46,"value":125},"Determine the available space accurately to ensure layouts adapt to the app window, not just the physical device.",{"type":40,"tag":56,"props":127,"children":128},{},[129,147,170,194],{"type":40,"tag":60,"props":130,"children":131},{},[132,145],{"type":40,"tag":133,"props":134,"children":135},"strong",{},[136,138],{"type":46,"value":137},"Use ",{"type":40,"tag":139,"props":140,"children":142},"code",{"className":141},[],[143],{"type":46,"value":144},"MediaQuery.sizeOf(context)",{"type":46,"value":146}," to get the size of the entire app window.",{"type":40,"tag":60,"props":148,"children":149},{},[150,160,162,168],{"type":40,"tag":133,"props":151,"children":152},{},[153,154],{"type":46,"value":137},{"type":40,"tag":139,"props":155,"children":157},{"className":156},[],[158],{"type":46,"value":159},"LayoutBuilder",{"type":46,"value":161}," to make layout decisions based on the parent widget's allocated space. Evaluate ",{"type":40,"tag":139,"props":163,"children":165},{"className":164},[],[166],{"type":46,"value":167},"constraints.maxWidth",{"type":46,"value":169}," to determine the appropriate widget tree to return.",{"type":40,"tag":60,"props":171,"children":172},{},[173,192],{"type":40,"tag":133,"props":174,"children":175},{},[176,178,184,186],{"type":46,"value":177},"Do not use ",{"type":40,"tag":139,"props":179,"children":181},{"className":180},[],[182],{"type":46,"value":183},"MediaQuery.orientationOf",{"type":46,"value":185}," or ",{"type":40,"tag":139,"props":187,"children":189},{"className":188},[],[190],{"type":46,"value":191},"OrientationBuilder",{"type":46,"value":193}," near the top of the widget tree to switch layouts. Device orientation does not accurately reflect the available app window space.",{"type":40,"tag":60,"props":195,"children":196},{},[197,202],{"type":40,"tag":133,"props":198,"children":199},{},[200],{"type":46,"value":201},"Do not check for hardware types",{"type":46,"value":203}," (e.g., \"phone\" vs. \"tablet\"). Flutter apps run in resizable windows, multi-window modes, and picture-in-picture. Base all layout decisions strictly on available window space.",{"type":40,"tag":49,"props":205,"children":207},{"id":206},"widget-sizing-and-constraints",[208],{"type":46,"value":78},{"type":40,"tag":121,"props":210,"children":211},{},[212,214],{"type":46,"value":213},"Understand and apply Flutter's core layout rule: ",{"type":40,"tag":133,"props":215,"children":216},{},[217],{"type":46,"value":218},"Constraints go down. Sizes go up. Parent sets position.",{"type":40,"tag":56,"props":220,"children":221},{},[222,327,383],{"type":40,"tag":60,"props":223,"children":224},{},[225,230,232,238,240,246,248,254,256,262,264,270,272],{"type":40,"tag":133,"props":226,"children":227},{},[228],{"type":46,"value":229},"Distribute Space:",{"type":46,"value":231}," Use ",{"type":40,"tag":139,"props":233,"children":235},{"className":234},[],[236],{"type":46,"value":237},"Expanded",{"type":46,"value":239}," and ",{"type":40,"tag":139,"props":241,"children":243},{"className":242},[],[244],{"type":46,"value":245},"Flexible",{"type":46,"value":247}," within ",{"type":40,"tag":139,"props":249,"children":251},{"className":250},[],[252],{"type":46,"value":253},"Row",{"type":46,"value":255},", ",{"type":40,"tag":139,"props":257,"children":259},{"className":258},[],[260],{"type":46,"value":261},"Column",{"type":46,"value":263},", or ",{"type":40,"tag":139,"props":265,"children":267},{"className":266},[],[268],{"type":46,"value":269},"Flex",{"type":46,"value":271}," widgets.\n",{"type":40,"tag":56,"props":273,"children":274},{},[275,309],{"type":40,"tag":60,"props":276,"children":277},{},[278,279,284,286,291,293,299,301,307],{"type":46,"value":137},{"type":40,"tag":139,"props":280,"children":282},{"className":281},[],[283],{"type":46,"value":237},{"type":46,"value":285}," to force a child to fill all remaining available space (equivalent to ",{"type":40,"tag":139,"props":287,"children":289},{"className":288},[],[290],{"type":46,"value":245},{"type":46,"value":292}," with ",{"type":40,"tag":139,"props":294,"children":296},{"className":295},[],[297],{"type":46,"value":298},"fit: FlexFit.tight",{"type":46,"value":300}," and a ",{"type":40,"tag":139,"props":302,"children":304},{"className":303},[],[305],{"type":46,"value":306},"flex",{"type":46,"value":308}," factor of 1.0).",{"type":40,"tag":60,"props":310,"children":311},{},[312,313,318,320,325],{"type":46,"value":137},{"type":40,"tag":139,"props":314,"children":316},{"className":315},[],[317],{"type":46,"value":245},{"type":46,"value":319}," to allow a child to size itself up to a specific limit while still expanding\u002Fcontracting. Use the ",{"type":40,"tag":139,"props":321,"children":323},{"className":322},[],[324],{"type":46,"value":306},{"type":46,"value":326}," factor to define the ratio of space consumption among siblings.",{"type":40,"tag":60,"props":328,"children":329},{},[330,335,337,343,344,350,352,358,359,365,367,373,375,381],{"type":40,"tag":133,"props":331,"children":332},{},[333],{"type":46,"value":334},"Constrain Width:",{"type":46,"value":336}," Prevent widgets from consuming all horizontal space on large screens. Wrap widgets like ",{"type":40,"tag":139,"props":338,"children":340},{"className":339},[],[341],{"type":46,"value":342},"GridView",{"type":46,"value":185},{"type":40,"tag":139,"props":345,"children":347},{"className":346},[],[348],{"type":46,"value":349},"ListView",{"type":46,"value":351}," in a ",{"type":40,"tag":139,"props":353,"children":355},{"className":354},[],[356],{"type":46,"value":357},"ConstrainedBox",{"type":46,"value":185},{"type":40,"tag":139,"props":360,"children":362},{"className":361},[],[363],{"type":46,"value":364},"Container",{"type":46,"value":366}," and define a ",{"type":40,"tag":139,"props":368,"children":370},{"className":369},[],[371],{"type":46,"value":372},"maxWidth",{"type":46,"value":374}," in the ",{"type":40,"tag":139,"props":376,"children":378},{"className":377},[],[379],{"type":46,"value":380},"BoxConstraints",{"type":46,"value":382},".",{"type":40,"tag":60,"props":384,"children":385},{},[386,391,393,399,400,406],{"type":40,"tag":133,"props":387,"children":388},{},[389],{"type":46,"value":390},"Lazy Rendering:",{"type":46,"value":392}," Always use ",{"type":40,"tag":139,"props":394,"children":396},{"className":395},[],[397],{"type":46,"value":398},"ListView.builder",{"type":46,"value":185},{"type":40,"tag":139,"props":401,"children":403},{"className":402},[],[404],{"type":46,"value":405},"GridView.builder",{"type":46,"value":407}," when rendering lists with an unknown or large number of items.",{"type":40,"tag":49,"props":409,"children":411},{"id":410},"device-and-orientation-behaviors",[412],{"type":46,"value":87},{"type":40,"tag":121,"props":414,"children":415},{},[416],{"type":46,"value":417},"Ensure the app behaves correctly across all device form factors and input methods.",{"type":40,"tag":56,"props":419,"children":420},{},[421,431,464],{"type":40,"tag":60,"props":422,"children":423},{},[424,429],{"type":40,"tag":133,"props":425,"children":426},{},[427],{"type":46,"value":428},"Do not lock screen orientation.",{"type":46,"value":430}," Locking orientation causes severe layout issues on foldable devices, often resulting in letterboxing (the app centered with black borders). Android large format tiers require both portrait and landscape support.",{"type":40,"tag":60,"props":432,"children":433},{},[434,439,441,447,449,455,457,462],{"type":40,"tag":133,"props":435,"children":436},{},[437],{"type":46,"value":438},"Fallback for Locked Orientation:",{"type":46,"value":440}," If business requirements strictly mandate a locked orientation, use the ",{"type":40,"tag":139,"props":442,"children":444},{"className":443},[],[445],{"type":46,"value":446},"Display API",{"type":46,"value":448}," to retrieve physical screen dimensions instead of ",{"type":40,"tag":139,"props":450,"children":452},{"className":451},[],[453],{"type":46,"value":454},"MediaQuery",{"type":46,"value":456},". ",{"type":40,"tag":139,"props":458,"children":460},{"className":459},[],[461],{"type":46,"value":454},{"type":46,"value":463}," fails to receive the larger window size in compatibility modes.",{"type":40,"tag":60,"props":465,"children":466},{},[467,472],{"type":40,"tag":133,"props":468,"children":469},{},[470],{"type":46,"value":471},"Support Multiple Inputs:",{"type":46,"value":473}," Implement support for basic mice, trackpads, and keyboard shortcuts. Ensure touch targets are appropriately sized and keyboard navigation is accessible.",{"type":40,"tag":49,"props":475,"children":477},{"id":476},"workflow-constructing-an-adaptive-layout",[478],{"type":46,"value":96},{"type":40,"tag":121,"props":480,"children":481},{},[482,484,489],{"type":46,"value":483},"Follow this workflow to implement a layout that adapts to the available ",{"type":40,"tag":139,"props":485,"children":487},{"className":486},[],[488],{"type":46,"value":380},{"type":46,"value":382},{"type":40,"tag":121,"props":491,"children":492},{},[493],{"type":40,"tag":133,"props":494,"children":495},{},[496],{"type":46,"value":497},"Task Progress:",{"type":40,"tag":56,"props":499,"children":502},{"className":500},[501],"contains-task-list",[503,516,531,547,564,595,623],{"type":40,"tag":60,"props":504,"children":507},{"className":505},[506],"task-list-item",[508,514],{"type":40,"tag":509,"props":510,"children":513},"input",{"disabled":511,"type":512},true,"checkbox",[],{"type":46,"value":515}," Identify the target widget that requires adaptive behavior.",{"type":40,"tag":60,"props":517,"children":519},{"className":518},[506],[520,523,525,530],{"type":40,"tag":509,"props":521,"children":522},{"disabled":511,"type":512},[],{"type":46,"value":524}," Wrap the widget tree in a ",{"type":40,"tag":139,"props":526,"children":528},{"className":527},[],[529],{"type":46,"value":159},{"type":46,"value":382},{"type":40,"tag":60,"props":532,"children":534},{"className":533},[506],[535,538,540,545],{"type":40,"tag":509,"props":536,"children":537},{"disabled":511,"type":512},[],{"type":46,"value":539}," Extract the ",{"type":40,"tag":139,"props":541,"children":543},{"className":542},[],[544],{"type":46,"value":167},{"type":46,"value":546}," from the builder callback.",{"type":40,"tag":60,"props":548,"children":550},{"className":549},[506],[551,554,556,562],{"type":40,"tag":509,"props":552,"children":553},{"disabled":511,"type":512},[],{"type":46,"value":555}," Define an adaptive breakpoint (e.g., ",{"type":40,"tag":139,"props":557,"children":559},{"className":558},[],[560],{"type":46,"value":561},"largeScreenMinWidth = 600",{"type":46,"value":563},").",{"type":40,"tag":60,"props":565,"children":567},{"className":566},[506],[568,571,573,586,588,593],{"type":40,"tag":509,"props":569,"children":570},{"disabled":511,"type":512},[],{"type":46,"value":572}," ",{"type":40,"tag":133,"props":574,"children":575},{},[576,578,584],{"type":46,"value":577},"If ",{"type":40,"tag":139,"props":579,"children":581},{"className":580},[],[582],{"type":46,"value":583},"maxWidth > largeScreenMinWidth",{"type":46,"value":585},":",{"type":46,"value":587}," Return a large-screen layout (e.g., a ",{"type":40,"tag":139,"props":589,"children":591},{"className":590},[],[592],{"type":46,"value":253},{"type":46,"value":594}," placing a navigation sidebar and content area side-by-side).",{"type":40,"tag":60,"props":596,"children":598},{"className":597},[506],[599,602,603,614,616,621],{"type":40,"tag":509,"props":600,"children":601},{"disabled":511,"type":512},[],{"type":46,"value":572},{"type":40,"tag":133,"props":604,"children":605},{},[606,607,613],{"type":46,"value":577},{"type":40,"tag":139,"props":608,"children":610},{"className":609},[],[611],{"type":46,"value":612},"maxWidth \u003C= largeScreenMinWidth",{"type":46,"value":585},{"type":46,"value":615}," Return a small-screen layout (e.g., a ",{"type":40,"tag":139,"props":617,"children":619},{"className":618},[],[620],{"type":46,"value":261},{"type":46,"value":622}," or standard navigation-style approach).",{"type":40,"tag":60,"props":624,"children":626},{"className":625},[506],[627,630],{"type":40,"tag":509,"props":628,"children":629},{"disabled":511,"type":512},[],{"type":46,"value":631}," Run validator -> resize the application window -> review layout transitions -> fix overflow errors.",{"type":40,"tag":49,"props":633,"children":635},{"id":634},"workflow-optimizing-for-large-screens",[636],{"type":46,"value":105},{"type":40,"tag":121,"props":638,"children":639},{},[640],{"type":46,"value":641},"Follow this workflow to prevent UI elements from stretching unnaturally on large displays.",{"type":40,"tag":121,"props":643,"children":644},{},[645],{"type":40,"tag":133,"props":646,"children":647},{},[648],{"type":46,"value":497},{"type":40,"tag":56,"props":650,"children":652},{"className":651},[501],[653,669,706,727,750,773],{"type":40,"tag":60,"props":654,"children":656},{"className":655},[506],[657,660,662,667],{"type":40,"tag":509,"props":658,"children":659},{"disabled":511,"type":512},[],{"type":46,"value":661}," Identify full-width components (e.g., ",{"type":40,"tag":139,"props":663,"children":665},{"className":664},[],[666],{"type":46,"value":349},{"type":46,"value":668},", text blocks, forms).",{"type":40,"tag":60,"props":670,"children":672},{"className":671},[506],[673,676,677,682,684,689,691,696,698,704],{"type":40,"tag":509,"props":674,"children":675},{"disabled":511,"type":512},[],{"type":46,"value":572},{"type":40,"tag":133,"props":678,"children":679},{},[680],{"type":46,"value":681},"If optimizing a list:",{"type":46,"value":683}," Convert ",{"type":40,"tag":139,"props":685,"children":687},{"className":686},[],[688],{"type":46,"value":398},{"type":46,"value":690}," to ",{"type":40,"tag":139,"props":692,"children":694},{"className":693},[],[695],{"type":46,"value":405},{"type":46,"value":697}," using ",{"type":40,"tag":139,"props":699,"children":701},{"className":700},[],[702],{"type":46,"value":703},"SliverGridDelegateWithMaxCrossAxisExtent",{"type":46,"value":705}," to automatically adjust column counts based on window size.",{"type":40,"tag":60,"props":707,"children":709},{"className":708},[506],[710,713,714,719,721,726],{"type":40,"tag":509,"props":711,"children":712},{"disabled":511,"type":512},[],{"type":46,"value":572},{"type":40,"tag":133,"props":715,"children":716},{},[717],{"type":46,"value":718},"If optimizing a form or text block:",{"type":46,"value":720}," Wrap the component in a ",{"type":40,"tag":139,"props":722,"children":724},{"className":723},[],[725],{"type":46,"value":357},{"type":46,"value":382},{"type":40,"tag":60,"props":728,"children":730},{"className":729},[506],[731,734,736,742,744,749],{"type":40,"tag":509,"props":732,"children":733},{"disabled":511,"type":512},[],{"type":46,"value":735}," Apply ",{"type":40,"tag":139,"props":737,"children":739},{"className":738},[],[740],{"type":46,"value":741},"BoxConstraints(maxWidth: [optimal_width])",{"type":46,"value":743}," to the ",{"type":40,"tag":139,"props":745,"children":747},{"className":746},[],[748],{"type":46,"value":357},{"type":46,"value":382},{"type":40,"tag":60,"props":751,"children":753},{"className":752},[506],[754,757,759,764,765,771],{"type":40,"tag":509,"props":755,"children":756},{"disabled":511,"type":512},[],{"type":46,"value":758}," Wrap the ",{"type":40,"tag":139,"props":760,"children":762},{"className":761},[],[763],{"type":46,"value":357},{"type":46,"value":351},{"type":40,"tag":139,"props":766,"children":768},{"className":767},[],[769],{"type":46,"value":770},"Center",{"type":46,"value":772}," widget to keep the constrained content centered on large screens.",{"type":40,"tag":60,"props":774,"children":776},{"className":775},[506],[777,780,782,787],{"type":40,"tag":509,"props":778,"children":779},{"disabled":511,"type":512},[],{"type":46,"value":781}," Run validator -> test on desktop\u002Ftablet target -> review horizontal stretching -> adjust ",{"type":40,"tag":139,"props":783,"children":785},{"className":784},[],[786],{"type":46,"value":372},{"type":46,"value":788}," or grid extents.",{"type":40,"tag":49,"props":790,"children":792},{"id":791},"examples",[793],{"type":46,"value":114},{"type":40,"tag":795,"props":796,"children":798},"h3",{"id":797},"adaptive-layout-using-layoutbuilder",[799],{"type":46,"value":800},"Adaptive Layout using LayoutBuilder",{"type":40,"tag":121,"props":802,"children":803},{},[804],{"type":46,"value":805},"Demonstrates switching between a mobile and desktop layout based on available width.",{"type":40,"tag":807,"props":808,"children":813},"pre",{"className":809,"code":810,"language":811,"meta":812,"style":812},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import 'package:flutter\u002Fmaterial.dart';\n\nconst double largeScreenMinWidth = 600.0;\n\nclass AdaptiveLayout extends StatelessWidget {\n  const AdaptiveLayout({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return LayoutBuilder(\n      builder: (context, constraints) {\n        if (constraints.maxWidth > largeScreenMinWidth) {\n          return _buildLargeScreenLayout();\n        } else {\n          return _buildSmallScreenLayout();\n        }\n      },\n    );\n  }\n\n  Widget _buildLargeScreenLayout() {\n    return Row(\n      children: [\n        const SizedBox(width: 250, child: Placeholder(color: Colors.blue)),\n        const VerticalDivider(width: 1),\n        Expanded(child: const Placeholder(color: Colors.green)),\n      ],\n    );\n  }\n\n  Widget _buildSmallScreenLayout() {\n    return const Placeholder(color: Colors.green);\n  }\n}\n","dart","",[814],{"type":40,"tag":139,"props":815,"children":816},{"__ignoreMap":812},[817,828,837,846,854,863,872,880,889,898,907,916,925,934,943,952,961,970,979,988,996,1005,1014,1023,1032,1041,1050,1059,1067,1075,1083,1092,1101,1109],{"type":40,"tag":818,"props":819,"children":822},"span",{"class":820,"line":821},"line",1,[823],{"type":40,"tag":818,"props":824,"children":825},{},[826],{"type":46,"value":827},"import 'package:flutter\u002Fmaterial.dart';\n",{"type":40,"tag":818,"props":829,"children":831},{"class":820,"line":830},2,[832],{"type":40,"tag":818,"props":833,"children":834},{"emptyLinePlaceholder":511},[835],{"type":46,"value":836},"\n",{"type":40,"tag":818,"props":838,"children":840},{"class":820,"line":839},3,[841],{"type":40,"tag":818,"props":842,"children":843},{},[844],{"type":46,"value":845},"const double largeScreenMinWidth = 600.0;\n",{"type":40,"tag":818,"props":847,"children":849},{"class":820,"line":848},4,[850],{"type":40,"tag":818,"props":851,"children":852},{"emptyLinePlaceholder":511},[853],{"type":46,"value":836},{"type":40,"tag":818,"props":855,"children":857},{"class":820,"line":856},5,[858],{"type":40,"tag":818,"props":859,"children":860},{},[861],{"type":46,"value":862},"class AdaptiveLayout extends StatelessWidget {\n",{"type":40,"tag":818,"props":864,"children":866},{"class":820,"line":865},6,[867],{"type":40,"tag":818,"props":868,"children":869},{},[870],{"type":46,"value":871},"  const AdaptiveLayout({super.key});\n",{"type":40,"tag":818,"props":873,"children":875},{"class":820,"line":874},7,[876],{"type":40,"tag":818,"props":877,"children":878},{"emptyLinePlaceholder":511},[879],{"type":46,"value":836},{"type":40,"tag":818,"props":881,"children":883},{"class":820,"line":882},8,[884],{"type":40,"tag":818,"props":885,"children":886},{},[887],{"type":46,"value":888},"  @override\n",{"type":40,"tag":818,"props":890,"children":892},{"class":820,"line":891},9,[893],{"type":40,"tag":818,"props":894,"children":895},{},[896],{"type":46,"value":897},"  Widget build(BuildContext context) {\n",{"type":40,"tag":818,"props":899,"children":901},{"class":820,"line":900},10,[902],{"type":40,"tag":818,"props":903,"children":904},{},[905],{"type":46,"value":906},"    return LayoutBuilder(\n",{"type":40,"tag":818,"props":908,"children":910},{"class":820,"line":909},11,[911],{"type":40,"tag":818,"props":912,"children":913},{},[914],{"type":46,"value":915},"      builder: (context, constraints) {\n",{"type":40,"tag":818,"props":917,"children":919},{"class":820,"line":918},12,[920],{"type":40,"tag":818,"props":921,"children":922},{},[923],{"type":46,"value":924},"        if (constraints.maxWidth > largeScreenMinWidth) {\n",{"type":40,"tag":818,"props":926,"children":928},{"class":820,"line":927},13,[929],{"type":40,"tag":818,"props":930,"children":931},{},[932],{"type":46,"value":933},"          return _buildLargeScreenLayout();\n",{"type":40,"tag":818,"props":935,"children":937},{"class":820,"line":936},14,[938],{"type":40,"tag":818,"props":939,"children":940},{},[941],{"type":46,"value":942},"        } else {\n",{"type":40,"tag":818,"props":944,"children":946},{"class":820,"line":945},15,[947],{"type":40,"tag":818,"props":948,"children":949},{},[950],{"type":46,"value":951},"          return _buildSmallScreenLayout();\n",{"type":40,"tag":818,"props":953,"children":955},{"class":820,"line":954},16,[956],{"type":40,"tag":818,"props":957,"children":958},{},[959],{"type":46,"value":960},"        }\n",{"type":40,"tag":818,"props":962,"children":964},{"class":820,"line":963},17,[965],{"type":40,"tag":818,"props":966,"children":967},{},[968],{"type":46,"value":969},"      },\n",{"type":40,"tag":818,"props":971,"children":973},{"class":820,"line":972},18,[974],{"type":40,"tag":818,"props":975,"children":976},{},[977],{"type":46,"value":978},"    );\n",{"type":40,"tag":818,"props":980,"children":982},{"class":820,"line":981},19,[983],{"type":40,"tag":818,"props":984,"children":985},{},[986],{"type":46,"value":987},"  }\n",{"type":40,"tag":818,"props":989,"children":991},{"class":820,"line":990},20,[992],{"type":40,"tag":818,"props":993,"children":994},{"emptyLinePlaceholder":511},[995],{"type":46,"value":836},{"type":40,"tag":818,"props":997,"children":999},{"class":820,"line":998},21,[1000],{"type":40,"tag":818,"props":1001,"children":1002},{},[1003],{"type":46,"value":1004},"  Widget _buildLargeScreenLayout() {\n",{"type":40,"tag":818,"props":1006,"children":1008},{"class":820,"line":1007},22,[1009],{"type":40,"tag":818,"props":1010,"children":1011},{},[1012],{"type":46,"value":1013},"    return Row(\n",{"type":40,"tag":818,"props":1015,"children":1017},{"class":820,"line":1016},23,[1018],{"type":40,"tag":818,"props":1019,"children":1020},{},[1021],{"type":46,"value":1022},"      children: [\n",{"type":40,"tag":818,"props":1024,"children":1026},{"class":820,"line":1025},24,[1027],{"type":40,"tag":818,"props":1028,"children":1029},{},[1030],{"type":46,"value":1031},"        const SizedBox(width: 250, child: Placeholder(color: Colors.blue)),\n",{"type":40,"tag":818,"props":1033,"children":1035},{"class":820,"line":1034},25,[1036],{"type":40,"tag":818,"props":1037,"children":1038},{},[1039],{"type":46,"value":1040},"        const VerticalDivider(width: 1),\n",{"type":40,"tag":818,"props":1042,"children":1044},{"class":820,"line":1043},26,[1045],{"type":40,"tag":818,"props":1046,"children":1047},{},[1048],{"type":46,"value":1049},"        Expanded(child: const Placeholder(color: Colors.green)),\n",{"type":40,"tag":818,"props":1051,"children":1053},{"class":820,"line":1052},27,[1054],{"type":40,"tag":818,"props":1055,"children":1056},{},[1057],{"type":46,"value":1058},"      ],\n",{"type":40,"tag":818,"props":1060,"children":1062},{"class":820,"line":1061},28,[1063],{"type":40,"tag":818,"props":1064,"children":1065},{},[1066],{"type":46,"value":978},{"type":40,"tag":818,"props":1068,"children":1070},{"class":820,"line":1069},29,[1071],{"type":40,"tag":818,"props":1072,"children":1073},{},[1074],{"type":46,"value":987},{"type":40,"tag":818,"props":1076,"children":1078},{"class":820,"line":1077},30,[1079],{"type":40,"tag":818,"props":1080,"children":1081},{"emptyLinePlaceholder":511},[1082],{"type":46,"value":836},{"type":40,"tag":818,"props":1084,"children":1086},{"class":820,"line":1085},31,[1087],{"type":40,"tag":818,"props":1088,"children":1089},{},[1090],{"type":46,"value":1091},"  Widget _buildSmallScreenLayout() {\n",{"type":40,"tag":818,"props":1093,"children":1095},{"class":820,"line":1094},32,[1096],{"type":40,"tag":818,"props":1097,"children":1098},{},[1099],{"type":46,"value":1100},"    return const Placeholder(color: Colors.green);\n",{"type":40,"tag":818,"props":1102,"children":1104},{"class":820,"line":1103},33,[1105],{"type":40,"tag":818,"props":1106,"children":1107},{},[1108],{"type":46,"value":987},{"type":40,"tag":818,"props":1110,"children":1112},{"class":820,"line":1111},34,[1113],{"type":40,"tag":818,"props":1114,"children":1115},{},[1116],{"type":46,"value":1117},"}\n",{"type":40,"tag":795,"props":1119,"children":1121},{"id":1120},"constraining-width-on-large-screens",[1122],{"type":46,"value":1123},"Constraining Width on Large Screens",{"type":40,"tag":121,"props":1125,"children":1126},{},[1127],{"type":46,"value":1128},"Demonstrates preventing a widget from consuming all horizontal space.",{"type":40,"tag":807,"props":1130,"children":1132},{"className":809,"code":1131,"language":811,"meta":812,"style":812},"import 'package:flutter\u002Fmaterial.dart';\n\nclass ConstrainedContent extends StatelessWidget {\n  const ConstrainedContent({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: ConstrainedBox(\n          constraints: const BoxConstraints(\n            maxWidth: 800.0, \u002F\u002F Maximum width for readability\n          ),\n          child: ListView.builder(\n            itemCount: 50,\n            itemBuilder: (context, index) {\n              return ListTile(\n                title: Text('Item $index'),\n              );\n            },\n          ),\n        ),\n      ),\n    );\n  }\n}\n",[1133],{"type":40,"tag":139,"props":1134,"children":1135},{"__ignoreMap":812},[1136,1143,1150,1158,1166,1173,1180,1187,1195,1203,1211,1219,1227,1235,1243,1251,1259,1267,1275,1283,1291,1298,1306,1314,1321,1328],{"type":40,"tag":818,"props":1137,"children":1138},{"class":820,"line":821},[1139],{"type":40,"tag":818,"props":1140,"children":1141},{},[1142],{"type":46,"value":827},{"type":40,"tag":818,"props":1144,"children":1145},{"class":820,"line":830},[1146],{"type":40,"tag":818,"props":1147,"children":1148},{"emptyLinePlaceholder":511},[1149],{"type":46,"value":836},{"type":40,"tag":818,"props":1151,"children":1152},{"class":820,"line":839},[1153],{"type":40,"tag":818,"props":1154,"children":1155},{},[1156],{"type":46,"value":1157},"class ConstrainedContent extends StatelessWidget {\n",{"type":40,"tag":818,"props":1159,"children":1160},{"class":820,"line":848},[1161],{"type":40,"tag":818,"props":1162,"children":1163},{},[1164],{"type":46,"value":1165},"  const ConstrainedContent({super.key});\n",{"type":40,"tag":818,"props":1167,"children":1168},{"class":820,"line":856},[1169],{"type":40,"tag":818,"props":1170,"children":1171},{"emptyLinePlaceholder":511},[1172],{"type":46,"value":836},{"type":40,"tag":818,"props":1174,"children":1175},{"class":820,"line":865},[1176],{"type":40,"tag":818,"props":1177,"children":1178},{},[1179],{"type":46,"value":888},{"type":40,"tag":818,"props":1181,"children":1182},{"class":820,"line":874},[1183],{"type":40,"tag":818,"props":1184,"children":1185},{},[1186],{"type":46,"value":897},{"type":40,"tag":818,"props":1188,"children":1189},{"class":820,"line":882},[1190],{"type":40,"tag":818,"props":1191,"children":1192},{},[1193],{"type":46,"value":1194},"    return Scaffold(\n",{"type":40,"tag":818,"props":1196,"children":1197},{"class":820,"line":891},[1198],{"type":40,"tag":818,"props":1199,"children":1200},{},[1201],{"type":46,"value":1202},"      body: Center(\n",{"type":40,"tag":818,"props":1204,"children":1205},{"class":820,"line":900},[1206],{"type":40,"tag":818,"props":1207,"children":1208},{},[1209],{"type":46,"value":1210},"        child: ConstrainedBox(\n",{"type":40,"tag":818,"props":1212,"children":1213},{"class":820,"line":909},[1214],{"type":40,"tag":818,"props":1215,"children":1216},{},[1217],{"type":46,"value":1218},"          constraints: const BoxConstraints(\n",{"type":40,"tag":818,"props":1220,"children":1221},{"class":820,"line":918},[1222],{"type":40,"tag":818,"props":1223,"children":1224},{},[1225],{"type":46,"value":1226},"            maxWidth: 800.0, \u002F\u002F Maximum width for readability\n",{"type":40,"tag":818,"props":1228,"children":1229},{"class":820,"line":927},[1230],{"type":40,"tag":818,"props":1231,"children":1232},{},[1233],{"type":46,"value":1234},"          ),\n",{"type":40,"tag":818,"props":1236,"children":1237},{"class":820,"line":936},[1238],{"type":40,"tag":818,"props":1239,"children":1240},{},[1241],{"type":46,"value":1242},"          child: ListView.builder(\n",{"type":40,"tag":818,"props":1244,"children":1245},{"class":820,"line":945},[1246],{"type":40,"tag":818,"props":1247,"children":1248},{},[1249],{"type":46,"value":1250},"            itemCount: 50,\n",{"type":40,"tag":818,"props":1252,"children":1253},{"class":820,"line":954},[1254],{"type":40,"tag":818,"props":1255,"children":1256},{},[1257],{"type":46,"value":1258},"            itemBuilder: (context, index) {\n",{"type":40,"tag":818,"props":1260,"children":1261},{"class":820,"line":963},[1262],{"type":40,"tag":818,"props":1263,"children":1264},{},[1265],{"type":46,"value":1266},"              return ListTile(\n",{"type":40,"tag":818,"props":1268,"children":1269},{"class":820,"line":972},[1270],{"type":40,"tag":818,"props":1271,"children":1272},{},[1273],{"type":46,"value":1274},"                title: Text('Item $index'),\n",{"type":40,"tag":818,"props":1276,"children":1277},{"class":820,"line":981},[1278],{"type":40,"tag":818,"props":1279,"children":1280},{},[1281],{"type":46,"value":1282},"              );\n",{"type":40,"tag":818,"props":1284,"children":1285},{"class":820,"line":990},[1286],{"type":40,"tag":818,"props":1287,"children":1288},{},[1289],{"type":46,"value":1290},"            },\n",{"type":40,"tag":818,"props":1292,"children":1293},{"class":820,"line":998},[1294],{"type":40,"tag":818,"props":1295,"children":1296},{},[1297],{"type":46,"value":1234},{"type":40,"tag":818,"props":1299,"children":1300},{"class":820,"line":1007},[1301],{"type":40,"tag":818,"props":1302,"children":1303},{},[1304],{"type":46,"value":1305},"        ),\n",{"type":40,"tag":818,"props":1307,"children":1308},{"class":820,"line":1016},[1309],{"type":40,"tag":818,"props":1310,"children":1311},{},[1312],{"type":46,"value":1313},"      ),\n",{"type":40,"tag":818,"props":1315,"children":1316},{"class":820,"line":1025},[1317],{"type":40,"tag":818,"props":1318,"children":1319},{},[1320],{"type":46,"value":978},{"type":40,"tag":818,"props":1322,"children":1323},{"class":820,"line":1034},[1324],{"type":40,"tag":818,"props":1325,"children":1326},{},[1327],{"type":46,"value":987},{"type":40,"tag":818,"props":1329,"children":1330},{"class":820,"line":1043},[1331],{"type":40,"tag":818,"props":1332,"children":1333},{},[1334],{"type":46,"value":1117},{"type":40,"tag":1336,"props":1337,"children":1338},"style",{},[1339],{"type":46,"value":1340},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1342,"total":1052},[1343,1355,1366,1378,1389,1398,1410,1422,1434,1446,1460,1470],{"slug":1344,"name":1344,"fn":1345,"description":1346,"org":1347,"tags":1348,"stars":21,"repoUrl":22,"updatedAt":1354},"dart-add-unit-test","write unit tests for Dart code","Write and organize unit tests for functions, methods, and classes using `package:test`. Use when creating new logic or fixing bugs to ensure code remains correct and regression-free.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1349,1351],{"name":1350,"slug":811,"type":14},"Dart",{"name":1352,"slug":1353,"type":14},"Testing","testing","2026-07-15T05:22:40.104823",{"slug":1356,"name":1356,"fn":1357,"description":1358,"org":1359,"tags":1360,"stars":21,"repoUrl":22,"updatedAt":1365},"dart-build-cli-app","build Dart command line applications","Entrypoint structure, exit codes, cross-platform scripts. Use when building command line utilities, scripts, or applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1361,1364],{"name":1362,"slug":1363,"type":14},"CLI","cli",{"name":1350,"slug":811,"type":14},"2026-07-15T05:22:18.863572",{"slug":1367,"name":1367,"fn":1368,"description":1369,"org":1370,"tags":1371,"stars":21,"repoUrl":22,"updatedAt":1377},"dart-collect-coverage","collect Dart test coverage reports","Collect coverage using the coverage packge and create an LCOV report",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1372,1373,1376],{"name":1350,"slug":811,"type":14},{"name":1374,"slug":1375,"type":14},"Reporting","reporting",{"name":1352,"slug":1353,"type":14},"2026-07-15T05:22:21.38636",{"slug":1379,"name":1379,"fn":1380,"description":1381,"org":1382,"tags":1383,"stars":21,"repoUrl":22,"updatedAt":1388},"dart-fix-runtime-errors","debug and fix Dart runtime errors","Uses get_runtime_errors and lsp to fetch an active stack trace, locate the failing line, apply a fix, and verify resolution via hot_reload.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1384,1385],{"name":1350,"slug":811,"type":14},{"name":1386,"slug":1387,"type":14},"Debugging","debugging","2026-07-15T05:22:22.622501",{"slug":1390,"name":1390,"fn":1391,"description":1392,"org":1393,"tags":1394,"stars":21,"repoUrl":22,"updatedAt":1397},"dart-generate-test-mocks","generate mock objects for Dart tests","Define and generate mock objects for external dependencies using `package:mockito` and `build_runner`. Use when unit testing classes that depend on complex external services like APIs or databases.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1395,1396],{"name":1350,"slug":811,"type":14},{"name":1352,"slug":1353,"type":14},"2026-07-15T05:22:42.607449",{"slug":1399,"name":1399,"fn":1400,"description":1401,"org":1402,"tags":1403,"stars":21,"repoUrl":22,"updatedAt":1409},"dart-migrate-to-checks-package","migrate test matchers to checks package","Replace the usage of `expect` and similar functions from `package:matcher`\nto `package:checks` equivalents.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1404,1405,1408],{"name":1350,"slug":811,"type":14},{"name":1406,"slug":1407,"type":14},"Migration","migration",{"name":1352,"slug":1353,"type":14},"2026-07-15T05:22:31.276564",{"slug":1411,"name":1411,"fn":1412,"description":1413,"org":1414,"tags":1415,"stars":21,"repoUrl":22,"updatedAt":1421},"dart-resolve-package-conflicts","resolve Dart package version conflicts","Workflow for fixing package version conflicts. Use this when `pub get` fails due to incompatible package versions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1416,1417,1418],{"name":1350,"slug":811,"type":14},{"name":1386,"slug":1387,"type":14},{"name":1419,"slug":1420,"type":14},"Engineering","engineering","2026-07-15T05:22:30.059335",{"slug":1423,"name":1423,"fn":1424,"description":1425,"org":1426,"tags":1427,"stars":21,"repoUrl":22,"updatedAt":1433},"dart-run-static-analysis","run static analysis and apply fixes","Execute `dart analyze` to identify warnings and errors, and use `dart fix --apply` to automatically resolve mechanical lint issues. Use during development to ensure code quality and before committing changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1428,1431,1432],{"name":1429,"slug":1430,"type":14},"Code Analysis","code-analysis",{"name":1350,"slug":811,"type":14},{"name":1386,"slug":1387,"type":14},"2026-07-15T05:22:23.861119",{"slug":1435,"name":1435,"fn":1436,"description":1437,"org":1438,"tags":1439,"stars":21,"repoUrl":22,"updatedAt":1445},"dart-setup-ffi-assets","package C\u002FC++ assets for Dart","Guides agents in compiling and packaging C\u002FC++ source code into dynamic or static libraries (Code Assets) using Dart's Native Assets hook system (via hook\u002Fbuild.dart and hook\u002Flink.dart utilizing package:hooks and package:native_toolchain_c). Use when a user asks to: 'setup native assets', 'compile C\u002FC++ source code', 'bundle dynamic libraries', 'build native C code', 'link native assets', 'implement build.dart or link.dart hooks', or 'integrate C\u002FC++ interop in Dart\u002FFlutter'. Helps agents avoid manual toolchain orchestration and configures secure hash-validated binary downloads or advanced linker tree-shaking with package:record_use mapping.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1440,1441,1444],{"name":1350,"slug":811,"type":14},{"name":1442,"slug":1443,"type":14},"Deployment","deployment",{"name":1419,"slug":1420,"type":14},"2026-07-15T05:22:20.138636",{"slug":1447,"name":1447,"fn":1448,"description":1449,"org":1450,"tags":1451,"stars":21,"repoUrl":22,"updatedAt":1459},"dart-skills-lint-setup","configure dart_skills_lint for Dart projects","Use this skill when you need to set up validation for AI agent skills in a Dart project for the first time.\nAdds the linter as a dev_dependency, creates a configuration file, and generates a baseline for legacy repos.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1452,1453,1456],{"name":1350,"slug":811,"type":14},{"name":1454,"slug":1455,"type":14},"Plugin Development","plugin-development",{"name":1457,"slug":1458,"type":14},"QA","qa","2026-07-15T05:22:47.488998",{"slug":1461,"name":1461,"fn":1462,"description":1463,"org":1464,"tags":1465,"stars":21,"repoUrl":22,"updatedAt":1469},"dart-skills-lint-validation","validate agent skills with dart_skills_lint","Use this skill when you need to validate AI agent skills with dart_skills_lint — running the linter, interpreting failures, fixing violations, and authoring custom rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1466,1467,1468],{"name":1350,"slug":811,"type":14},{"name":1454,"slug":1455,"type":14},{"name":1457,"slug":1458,"type":14},"2026-07-21T05:38:34.451024",{"slug":1471,"name":1471,"fn":1472,"description":1473,"org":1474,"tags":1475,"stars":21,"repoUrl":22,"updatedAt":1478},"dart-use-ffigen","generate FFI bindings with ffigen","Guide agents to use `package:ffigen` to automatically generate FFI bindings instead of writing them manually. Use this skill when a task involves writing new FFI bindings, extending C\u002FObjective-C\u002FSwift integrations, or replacing hand-crafted `dart:ffi` setups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1476,1477],{"name":1350,"slug":811,"type":14},{"name":1419,"slug":1420,"type":14},"2026-07-15T05:22:17.592351",{"items":1480,"total":1025},[1481,1486,1491,1497,1502,1507,1513],{"slug":1344,"name":1344,"fn":1345,"description":1346,"org":1482,"tags":1483,"stars":21,"repoUrl":22,"updatedAt":1354},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1484,1485],{"name":1350,"slug":811,"type":14},{"name":1352,"slug":1353,"type":14},{"slug":1356,"name":1356,"fn":1357,"description":1358,"org":1487,"tags":1488,"stars":21,"repoUrl":22,"updatedAt":1365},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1489,1490],{"name":1362,"slug":1363,"type":14},{"name":1350,"slug":811,"type":14},{"slug":1367,"name":1367,"fn":1368,"description":1369,"org":1492,"tags":1493,"stars":21,"repoUrl":22,"updatedAt":1377},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1494,1495,1496],{"name":1350,"slug":811,"type":14},{"name":1374,"slug":1375,"type":14},{"name":1352,"slug":1353,"type":14},{"slug":1379,"name":1379,"fn":1380,"description":1381,"org":1498,"tags":1499,"stars":21,"repoUrl":22,"updatedAt":1388},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1500,1501],{"name":1350,"slug":811,"type":14},{"name":1386,"slug":1387,"type":14},{"slug":1390,"name":1390,"fn":1391,"description":1392,"org":1503,"tags":1504,"stars":21,"repoUrl":22,"updatedAt":1397},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1505,1506],{"name":1350,"slug":811,"type":14},{"name":1352,"slug":1353,"type":14},{"slug":1399,"name":1399,"fn":1400,"description":1401,"org":1508,"tags":1509,"stars":21,"repoUrl":22,"updatedAt":1409},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1510,1511,1512],{"name":1350,"slug":811,"type":14},{"name":1406,"slug":1407,"type":14},{"name":1352,"slug":1353,"type":14},{"slug":1411,"name":1411,"fn":1412,"description":1413,"org":1514,"tags":1515,"stars":21,"repoUrl":22,"updatedAt":1421},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1516,1517,1518],{"name":1350,"slug":811,"type":14},{"name":1386,"slug":1387,"type":14},{"name":1419,"slug":1420,"type":14}]