Playx Theme
Playx Theme: Effortlessly control your app's visual style. Seamlessly switch themes, enjoy smooth animations, and tailor custom color schemes for each theme with ease in your Flutter projects## Features
- Easy Theme Management: Create and manage app themes effortlessly.
- Smooth Transitions: Switch between themes with unique transitions.
- Custom Colors: Define custom colors for each theme, e.g.,
context.playxColors.primary
. - Automatic Theme Persistence: Automatically store and load the last used theme.
- Utility Widgets: Utilize custom utilities and widgets for enhanced theming.
Installation
Add the following line to your dependencies
in pubspec.yaml
:
playx_theme: ^1.0.1
Usage
Boot PlayxTheme
Initialize and boot the themes before running your app.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Boot the AppTheme
await PlayxTheme.boot(
config: PlayxThemeConfig(
themes: [
XTheme(
id: 'light',
name: 'Light',
themeData: ThemeData.light(),
),
XTheme(
id: 'dark',
name: 'Dark',
themeData: ThemeData.dark(),
),
],
),
);
// Run the app
runApp(const MyApp());
}
Wrap Your App with PlayXThemeBuilder
Use PlayXThemeBuilder
to wrap your app and apply the themes.
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return PlayXThemeBuilder(
builder: (context, theme) {
return MaterialApp(
title: 'Flutter Demo',
theme: theme.themeData,
home: const MyHomePage(),
);
},
);
}
}
Update App Theme
Switch between themes using PlayxTheme
.
FloatingActionButton(
onPressed: () {
PlayxTheme.updateById('dark');
},
child: Icon(
Icons.next,
color: PlayxTheme.colorScheme.onBackground,
),
)
Accessing Current Theme
Retrieve the current theme information using context extensions.
final themeId = context.xTheme.id;
// Legacy Access
final currentThemeId = PlayxTheme.currentTheme.id;
final currentThemeData = PlayxTheme.currentThemeData;
Available Methods
Method | Description |
---|---|
index |
Returns current theme index. |
id |
Returns current theme id. |
name |
Returns current theme name. |
currentTheme |
Returns current XTheme . |
currentThemeData |
Returns current ThemeData . |
colors |
Returns current XTheme colors. |
initialTheme |
Returns start theme if provided. |
supportedThemes |
Returns list of supported themes configured in PlayxThemeConfig . |
next |
Updates the app theme to the next theme. |
updateByIndex |
Updates the app theme by the index. |
updateTo |
Updates the app theme to a specific XTheme . |
updateById |
Updates the app theme to a specific theme id. |
isDeviceInDarkMode |
Determines whether the device is in dark or light mode. |
updateToLightMode |
Updates the app theme to the first light theme in supported themes. |
updateToDarkMode |
Updates the app theme to the first dark theme in supported themes. |
updateToDeviceMode |
Updates the app theme to the device mode. |
updateByThemeMode |
Updates the app theme to the first theme that matches the given mode |
clearLastSavedTheme |
Clears the last saved theme. |
Here's the updated README section for animations in the Playx theme package, reflecting the new animation types and their implementations:
Animation
The Playx theme package offers various animations to enhance the theme change experience in your app.
PlayxThemeSwitchingArea
To show animations when changing themes, wrap the relevant screen with PlayxThemeSwitchingArea
.
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return PlayxThemeSwitchingArea(
child: Scaffold(
appBar: AppBar(
title: const Text('Playx Theme Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('You have pushed the button this many times:'),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => PlayxTheme.next(),
tooltip: 'Increment',
child: const Icon(Icons.add),
),
),
);
}
}
Theme Switching Animation Control
Customize theme switching animations using the PlayxThemeAnimation
class and its subclasses. You can control various aspects of the animation.
PlayxThemeAnimation
The base class for theme animations provides common settings, including:
isReversed
: Reverses the animation direction.onAnimationFinish
: Callback triggered when the animation finishes.duration
: Duration of the animation.
PlayxThemeClipperAnimation
Defines clipping-based animations with custom clipper settings.
PlayxThemeAnimation.clipper(
clipper: const ThemeSwitcherCircleClipper(),
offset: Offset.zero,
)
You can customize theme switching animation with various parameters.
- Starting Point: Customize the animation's starting point with
offset
orcontext
. - Custom Clipper: Use a custom
clipper
likeThemeSwitcherBoxClipper
orThemeSwitcherCircleClipper
.
You can use PlayxThemeSwitcher
to switch themes with an animation starting from the triggering widget.
PlayxThemeSwitcher(
builder: (ctx, theme) => FloatingActionButton(
onPressed: () {
PlayxTheme.next(
animation:PlayxThemeAnimation.clipper(
clipper: const ThemeSwitcherCircleClipper(),
context: ctx,),
);
},
tooltip: 'Next Theme',
child: Icon(
Icons.add,
color: context.colorScheme.onPrimary,
),
),
);
This will change the theme with a circle clipping animation starting from the FloatingActionButton.
PlayxThemeFadeAnimation
Controls fade effects with adjustable opacity levels.
PlayxThemeAnimation.fade(
begin: 0.0,
end: 1.0,
)
PlayxThemeScaleAnimation
Handles scaling effects with adjustable scale values.
PlayxThemeAnimation.scale(
begin: 0.5,
end: 1.0,
)
PlayxThemeHorizontalSlideAnimation
Creates horizontal slide effects with start and end offsets.
PlayxThemeAnimation.horizontalSlide(
beginOffset: Offset(-1.0, 0.0),
endOffset: Offset(0.0, 0.0),
)
PlayxThemeVerticalSlideAnimation
Creates vertical slide effects with start and end offsets.
PlayxThemeAnimation.verticalSlide(
beginOffset: Offset(0.0, -1.0),
endOffset: Offset(0.0, 0.0),
)
Customize Your Themes
Create a PlayxThemeConfig
object and pass it to PlayxTheme.boot()
to customize themes.
final config = PlayxThemeConfig(
themes: [
XTheme(
id: 'light',
name: 'Light',
themeData: ThemeData(
brightness: Brightness.light,
colorScheme: lightColors.colorScheme,
useMaterial3: true,
),
cupertinoThemeData: const CupertinoThemeData(
brightness: Brightness.light,
),
colors: lightColors,
),
XTheme.builder(
id: 'dark',
name: 'Dark',
initialTheme: ThemeData(
brightness: Brightness.dark,
colorScheme: darkColors.colorScheme,
useMaterial3: true,
),
themeBuilder: (locale) => ThemeData(
brightness: Brightness.dark,
colorScheme: darkColors.colorScheme,
useMaterial3: true,
),
cupertinoThemeBuilder: (locale) => const CupertinoThemeData(
brightness: Brightness.dark,
),
isDark: true,
colors: darkColors,
),
],
initialThemeIndex: PlayxTheme.isDeviceInDarkMode() ? 1 : 0,
);
Customize Theme's Colors
Create custom colors for each theme by extending PlayxColors
.
class LightColors extends PlayxColors{
@override
Color get background => XColors.white;
@override
Color get error => XColors.red;
@override
Color get onBackground => XColors.black;
}
Use custom colors in your widget tree.
ColoredBox(color: context.playxColors.primary);
Extend PlayxColors
to add more colors.
abstract class AppColors extends PlayxColors{
Color get containerBackgroundColor;
static const Color blue = Colors.blue;
}
class LightColorScheme extends AppColors {
@override
Color get containerBackgroundColor => XColors.white;
@override
Color get background => XColors.white;
@override
Color get error => XColors.red;
@override
Color get onBackground => XColors.black;
}
Access the extended colors.
static AppColors of(BuildContext context) => context.playxColors as AppColors;
final primary = AppColors.of(context).primary;
extension AppColorsExtension on BuildContext {
AppColors get colors => AppColors.of(this);
}
ColoredBox(color: context.colors.primary);
Material 3 Support
The package supports both Material 2 and Material 3. It includes
utilities and widgets to help with Material 3 integration, such as ImageTheme
and getBlendedColorScheme
. Additionally, it includes the flex_seed_scheme
package for advanced color scheme creation.
Reference & Documentation
- Check out the documentation for detailed information on how to integrate and utilize
playx_theme
in your Flutter applications. - The theme switching animation is based on the animated_theme_switcher package.
Support and Contribution
For questions, issues, or feature requests, visit the GitHub repository. Contributions are welcome!
See Also
- Playx: Ecosystem for redundant features, less code, more productivity, better organizing.
- Playx_core: Core of the Playx ecosystem, helping with app theming and localization.
- Playx_localization: Localization and internationalization for Flutter apps from the Playx ecosystem.
License
This project is licensed under the MIT License - see the LICENSE file for details.