بنقرة واحدة
flutter-theming
How to customize your app's theme using Flutter's theming system
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
How to customize your app's theme using Flutter's theming system
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Configure your Flutter app to support assistive technologies like Screen Readers
Add animated effects to your Flutter app
Measure and reduce the size of the Flutter app bundle, APK, or IPA
Use the Flutter team's recommended app architecture
Execute long-running tasks in a background thread in Flutter
Set up a macOS environment for Flutter development
| name | flutter-theming |
| description | How to customize your app's theme using Flutter's theming system |
| metadata | {"model":"models/gemini-3.1-pro-preview","last_modified":"Fri, 27 Feb 2026 00:26:31 GMT"} |
Updates and manages Flutter application styling by migrating legacy Material 2 implementations to Material 3, normalizing component themes, updating deprecated button classes, and adapting UI idioms for cross-platform consistency. Assumes a Flutter environment using Dart.
Analyze Current Theme State
Review the existing Flutter codebase to identify legacy Material 2 components, deprecated button classes (FlatButton, RaisedButton, OutlineButton), and outdated theme properties (e.g., accentColor, color in AppBarTheme).
STOP AND ASK THE USER: "What is the primary seed color for the new Material 3 ColorScheme, and which target platforms (iOS, Android, Windows, macOS, Linux, Web) should be prioritized for platform idioms?"
Decision Logic: Component Migration When encountering legacy widgets, use the following decision tree to determine the replacement:
BottomNavigationBar -> REPLACE WITH NavigationBar (uses NavigationDestination).Drawer -> REPLACE WITH NavigationDrawer (uses NavigationDrawerDestination).ToggleButtons -> REPLACE WITH SegmentedButton (uses ButtonSegment and Set for selection).FlatButton -> REPLACE WITH TextButton.RaisedButton -> REPLACE WITH ElevatedButton (or FilledButton for no elevation).OutlineButton -> REPLACE WITH OutlinedButton.Implement App-Wide Material 3 Theme
Define the global ThemeData using ColorScheme.fromSeed. Ensure useMaterial3 is implicitly or explicitly true. Remove all references to deprecated accent properties (accentColor, accentColorBrightness, accentTextTheme, accentIconTheme).
MaterialApp(
title: 'App Name',
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.deepPurple,
brightness: Brightness.light,
),
// Use colorScheme.secondary instead of accentColor
),
darkTheme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.deepPurple,
brightness: Brightness.dark,
),
),
home: const MyHomePage(),
);
Normalize Component Themes
Update all component theme definitions in ThemeData to use their *ThemeData equivalents. Do not use the base theme classes for configuration.
cardTheme -> CardThemeDatadialogTheme -> DialogThemeDatatabBarTheme -> TabBarThemeDataappBarTheme -> AppBarThemeData (Replace color with backgroundColor)bottomAppBarTheme -> BottomAppBarThemeDatainputDecorationTheme -> InputDecorationThemeDataThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
appBarTheme: const AppBarThemeData(
backgroundColor: Colors.blue, // Do not use 'color'
elevation: 4.0,
),
cardTheme: const CardThemeData(
elevation: 2.0,
),
);
Migrate Buttons and Button Styles
Replace legacy buttons. Use the styleFrom() static method for simple overrides, or ButtonStyle with MaterialStateProperty for state-dependent styling.
// Simple override using styleFrom
TextButton(
style: TextButton.styleFrom(
foregroundColor: Colors.blue,
disabledForegroundColor: Colors.red,
),
onPressed: () {},
child: const Text('TextButton'),
)
// State-dependent override using MaterialStateProperty
OutlinedButton(
style: ButtonStyle(
side: MaterialStateProperty.resolveWith<BorderSide>(
(Set<MaterialState> states) {
if (states.contains(MaterialState.pressed)) {
return const BorderSide(color: Colors.blue, width: 2);
}
return const BorderSide(color: Colors.grey, width: 1);
}
),
),
onPressed: () {},
child: const Text('OutlinedButton'),
)
Decision Logic: Platform Idioms Apply platform-specific adaptations based on the host OS to reduce cognitive load and build user trust.
thumbVisibility: true (or alwaysShown). IF mobile -> Use default auto-hiding behavior.SelectableText to allow mouse selection on Web/Desktop.// Platform-aware button ordering
TextDirection btnDirection = Platform.isWindows
? TextDirection.rtl
: TextDirection.ltr;
Row(
children: [
const Spacer(),
Row(
textDirection: btnDirection,
children: [
TextButton(
onPressed: () => Navigator.pop(context, false),
child: const Text('Cancel'),
),
ElevatedButton(
onPressed: () => Navigator.pop(context, true),
child: const Text('OK'),
),
],
),
],
)
Validate-and-Fix
Scan the generated code to verify that no FlatButton, RaisedButton, OutlineButton, or ButtonTheme classes remain. Verify that AppBarTheme does not use the color property. Fix any instances found.
ColorScheme (e.g., Theme.of(context).colorScheme.primary). Do not hardcode hex colors unless explicitly requested.FlatButton, RaisedButton, or OutlineButton.accentColor, accentColorBrightness, accentTextTheme, or accentIconTheme. Use colorScheme.secondary and colorScheme.onSecondary instead.Data to component themes when configuring ThemeData (e.g., CardThemeData, not CardTheme).color property in AppBarTheme or AppBarThemeData; strictly use backgroundColor.