FlutterInit Extended UI is the generated widget kit under lib/src/shared/widgets/ui/. Every project gets adaptive App widgets. Turn on shadcn_ui and you also get ShadApp wrappers with matching constructors, so auth and home can change kits without a rewrite.
Short launch note: Extended UI update .
The problem this solves
Architecture and state get you a clean tree. UI still does not. Teams invent buttons, fields, and empty states per screen, then argue about iOS vs Android chrome later.
Extended UI puts one kit in the repo from generate time: one import path, design tokens, a debug showcase, and notes in DESIGN.md so agents stop inventing EdgeInsets.all(13).
Folder layout
lib/src/shared/widgets/ui/
app/ # always generated
app_platform.dart # AppPlatformScope + helpers
actions/ # AppButton, AppFab, AppChip, …
inputs/ # AppTextField, AppOtpField, …
display/ # AppCard, AppAvatar, …
feedback/ # loading, dialogs, sheets, snackbars
navigation/ # AppScaffold, AppTopBar, …
layout/ # AppGap, AppSection, …
shadcn/ # only when ui.shadcn is true
shad_theme.dart
shad_app_button.dart
…
ui_showcase_screen.dart
ui.dart # barrel export
Import through your shared barrel, usually imports.dart. Prefer AppButton over raw ElevatedButton or CupertinoButton.
AppPlatformScope sets how App widgets render:
Resolution order, highest wins:
Per-widget platform:
Nearest AppPlatformScope
If adaptive, Material on Android and Cupertino on iOS/macOS from ThemeData.platform
Colors still come from your seed ColorScheme. Forcing Cupertino does not invent a second palette.
I default projects to adaptive unless the product is clearly Material-only, like many web clients, or iOS-first.
Building a screen
Generated login, signup, home, and onboarding already use the kit. A form looks like this:
Keep spacing and type on tokens: AppSpacing, context.textTheme, context.colors. DESIGN.md explained covers the full contract.
In debug builds, open /debug/ui-showcase, routed as AppRoutes.uiShowcase, to browse the kit without a scratch screen.
Adding shadcn_ui
On UI & theme, select shadcn_ui. Generation adds:
shadcn_ui in pubspec.yaml. Needs Flutter SDK 3.41 or newer.
buildShadLightTheme / buildShadDarkTheme from the same seed as Material
ShadApp wrappers under ui/shadcn/ with the same params as App
Feature templates swap names through Handlebars partials. Same screen tree, different widget:
Partial App kit shadcn as default kit ui/buttonAppButtonShadAppButtonui/text_fieldAppTextFieldShadAppTextFieldui/cardAppCardShadAppCard
Default app when shadcn is on
Choice Root Screens default to MaterialApp MaterialApp with shadcn wrapAppCupertinoApp CupertinoApp with shadcn wrapAppShadApp ShadApp as theme hostShadApp
Both kits stay exported when shadcn is enabled. You can call AppButton from a ShadApp project if you want a native control in one place.
Wizard to config
UI & theme choice Config Material theme.preset: material3, ui.shadcn: false, ui.defaultKit: appCupertino theme.preset: cupertino, often ui.platformStyle: cupertinoshadcn_ui ui.shadcn: true; default app sets defaultKit and rootAppearance theme.darkMode.enabled / .systemPrimary color theme.primaryColor (seed for Material and Shad themes)
npx create-flutterinit asks the same UI questions.
What I pick when
Goal Pick Native phone/tablet App kit, platform style adaptive Material everywhere, including web demos and admin App kit + material iOS-first chrome Cupertino theme or cupertino platform style Web-style menus, tables, dense controls shadcn_ui, often with ShadApp as default Cheap kit swaps later Stick to App / ShadApp in features
Mixing raw Material widgets into feature screens while the rest of the app uses the kit is how you get uneven spacing and two button styles. Don't.
Checklist after generate
Open lib/src/shared/widgets/ui/ and skim app/
Hit /debug/ui-showcase once
Read the UI section in DESIGN.md
Build new screens with App (or ShadApp if that is the default kit)
Skip raw ElevatedButton / TextField in features unless you have a reason
Generate on /create , set UI & theme, then open the tree or Preview code before you download.