Gradient Colors and Styles
A comprehensive Flutter package for creating beautiful gradient styles across your entire application with highly customizable widgets and gradient configurations.
Features
Core Components
- Flexible gradient configuration system via
GradientConfig - Multiple gradient types (linear, radial, sweep)
- Support for multiple colors with customizable positions
- Preset gradient library with ready-to-use configurations
- Gradient transformation methods (reverse, rotate, tint, brightness/saturation adjustment)
Containers and Surfaces
GradientContainer- Containers with gradient backgrounds and interactive effectsGradientCard- Card widgets with gradient styling and elevationGradientDivider- Horizontal, vertical, and dashed dividers with gradient coloring
Buttons and Controls
GradientButton- Buttons with gradient backgrounds, icons, and loading statesGradientFAB- Floating Action Buttons with gradient stylingGradientToggle- Toggle switches with gradient when activeGradientSlider- Sliders with gradient tracksGradientRangeSlider- Range sliders with gradient tracks
Text and Icons
GradientText- Text with gradient fill, shadows, and animation effectsGradientIcon- Icons with gradient fill and notification badges
Navigation
GradientAppBar- App bars with gradient backgroundsGradientTabBar- Tab bars with gradient backgrounds and custom indicators
Progress Indicators
GradientProgressIndicator- Linear and circular progress indicators with gradient fills
Keywords
flutter, gradient, ui, design, colors, animation, button, container, text, slider, progress, card, appbar, tabbar, toggle, icon, divider, customization, material design, themes, styling, widget, effects, shadows, transformation
Requirements
- Flutter SDK: ^3.8.0
- Dart SDK: ^3.8.0
Installation
Add the package to your pubspec.yaml file:
dependencies:
gradient_color_and_styles: ^1.0.0
Run flutter pub get to install the package.
Import
import 'package:gradient_color_and_styles/gradient_color_and_styles.dart';
Usage
Using preset gradients
import 'package:flutter/material.dart';
import 'package:gradient_color_and_styles/gradient_color_and_styles.dart';
// Use a preset gradient with a container
GradientContainer(
gradient: PresetGradients.sunset,
height: 100,
borderRadius: BorderRadius.circular(16),
child: Center(
child: Text('Sunset Gradient', style: TextStyle(color: Colors.white)),
),
)
Creating custom gradients
// Create a custom gradient with 3 colors
final customGradient = GradientConfig(
colors: [
Colors.purple,
Colors.blue,
Colors.cyan,
],
type: GradientType.linear,
direction: GradientDirection.topLeftToBottomRight,
);
// Generate gradients from a single color
final monochromaticGradient = GradientConfig.monochromatic(
color: Colors.teal,
steps: 4,
);
// Create complementary gradients
final complementaryGradient = GradientConfig.complementary(
baseColor: Colors.orange,
);
Gradient Containers
// Basic container
GradientContainer(
gradient: PresetGradients.ocean,
height: 100,
width: 200,
borderRadius: BorderRadius.circular(16),
elevation: 4.0,
child: Center(child: Text('Ocean Gradient', style: TextStyle(color: Colors.white))),
)
// Interactive container
GradientContainer(
gradient: PresetGradients.fire,
onTap: () => print('Container tapped!'),
enableInteractiveEffects: true,
child: Text('Tap me!', style: TextStyle(color: Colors.white)),
)
// Using factory constructors
GradientContainer.card(
gradient: PresetGradients.nature,
elevation: 8.0,
child: Padding(
padding: EdgeInsets.all(16.0),
child: Text('Card Style', style: TextStyle(color: Colors.white)),
),
)
GradientContainer.circular(
gradient: PresetGradients.rainbow,
size: 100,
child: Icon(Icons.star, color: Colors.white),
)
// Themed container
GradientContainer.fire(
child: Text('Fire Theme', style: TextStyle(color: Colors.white)),
height: 100,
)
Gradient Buttons
// Basic button
GradientButton(
gradient: PresetGradients.sunset,
text: 'Click Me',
onPressed: () => print('Button pressed!'),
)
// Button with icon
GradientButton(
gradient: PresetGradients.ocean,
text: 'Save',
icon: Icons.save,
iconPosition: IconPosition.left,
onPressed: () {},
)
// Loading button
GradientButton(
gradient: PresetGradients.rainbow,
text: 'Loading',
isLoading: true,
onPressed: () {},
)
// Factory constructors
GradientButton.elevated(
gradient: PresetGradients.fire,
text: 'Elevated Button',
onPressed: () {},
elevation: 8.0,
)
GradientButton.outlined(
gradient: PresetGradients.nature,
text: 'Outlined Button',
onPressed: () {},
borderWidth: 2.0,
)
Gradient Text and Icons
// Basic gradient text
GradientText(
'Rainbow Text',
gradient: PresetGradients.rainbow,
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
)
// Text with shadow
GradientText.withShadow(
'Text with Shadow',
gradient: PresetGradients.sunset,
style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold),
shadowColor: Colors.black54,
shadowOffset: Offset(2, 2),
)
// Animated text
GradientText.animated(
'Animated Text',
gradient: PresetGradients.rainbow,
style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold),
)
// Gradient icons
GradientIcon(
icon: Icons.favorite,
gradient: PresetGradients.sunset,
size: 48,
)
GradientIcon.withBadge(
icon: Icons.notifications,
gradient: PresetGradients.ocean,
badgeText: '3',
size: 48,
)
Navigation Components
// Gradient AppBar
Scaffold(
appBar: GradientAppBar(
title: Text('Gradient AppBar'),
gradient: PresetGradients.ocean,
elevation: 4.0,
actions: [
IconButton(icon: Icon(Icons.settings), onPressed: () {}),
],
),
body: // Your content
)
// Gradient TabBar
TabBar(
controller: _tabController,
tabs: [
Tab(text: 'Home'),
Tab(text: 'Profile'),
Tab(text: 'Settings'),
],
gradient: PresetGradients.sunset,
)
// Specialized TabBar styles
GradientTabBar.pill(
gradient: PresetGradients.rainbow,
controller: _tabController,
tabs: myTabs,
indicatorGradient: PresetGradients.ocean,
)
Progress Indicators
// Linear progress indicator
GradientProgressIndicator.linear(
gradient: PresetGradients.sunset,
value: 0.7,
height: 10.0,
)
// Circular progress indicator
GradientProgressIndicator.circular(
gradient: PresetGradients.ocean,
value: 0.35,
size: 80.0,
strokeWidth: 8.0,
showPercentageLabel: true,
)
// Buffer indicator
GradientProgressIndicator.buffer(
gradient: PresetGradients.rainbow,
value: 0.3,
bufferValue: 0.7,
)
Sliders and Controls
// Gradient slider
GradientSlider(
gradient: PresetGradients.sunset,
value: _sliderValue,
onChanged: (value) {
setState(() => _sliderValue = value);
},
)
// Range slider
GradientRangeSlider(
gradient: PresetGradients.ocean,
values: _rangeValues,
onChanged: (values) {
setState(() => _rangeValues = values);
},
)
// Toggle switch
GradientToggle(
value: _toggleValue,
onChanged: (value) {
setState(() => _toggleValue = value);
},
activeGradient: PresetGradients.sunset,
)
Dividers
// Horizontal divider
GradientDivider.horizontal(
gradient: PresetGradients.rainbow,
thickness: 3.0,
rounded: true,
)
// Vertical divider
GradientDivider.vertical(
gradient: PresetGradients.sunset,
thickness: 2.0,
height: 100,
)
// Dashed divider
GradientDivider.dashed(
gradient: PresetGradients.ocean,
thickness: 2.0,
dashPattern: [6, 3],
)
Advanced Usage Examples
Combining Multiple Gradient Widgets
// Create a gradient card with gradient text and button
GradientCard(
gradient: PresetGradients.space,
elevation: 8.0,
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
GradientText.heading(
'Premium Plan',
gradient: PresetGradients.sunset,
fontSize: 24,
),
SizedBox(height: 16),
Text('Get access to all premium features', style: TextStyle(color: Colors.white70)),
SizedBox(height: 24),
GradientButton(
gradient: PresetGradients.fire,
text: 'Subscribe Now',
icon: Icons.star,
onPressed: () {},
),
],
),
),
)
Creating a Custom Theme with Gradients
// Define your app's gradient theme
class AppGradients {
static final primary = PresetGradients.ocean;
static final secondary = PresetGradients.sunset;
static final accent = PresetGradients.fire;
static final background = GradientConfig(
colors: [Colors.grey.shade900, Colors.black],
direction: GradientDirection.topToBottom,
);
}
// Use it throughout your app
Scaffold(
appBar: GradientAppBar(
title: Text('Themed App'),
gradient: AppGradients.primary,
),
body: GradientContainer(
gradient: AppGradients.background,
child: Center(
child: GradientButton(
gradient: AppGradients.accent,
text: 'Themed Button',
onPressed: () {},
),
),
),
floatingActionButton: GradientFAB(
gradient: AppGradients.secondary,
icon: Icons.add,
onPressed: () {},
),
)
Creating Dynamic/Animated Gradients
// Animated container that changes gradient on tap
class AnimatedGradientDemo extends StatefulWidget {
@override
State<AnimatedGradientDemo> createState() => _AnimatedGradientDemoState();
}
class _AnimatedGradientDemoState extends State<AnimatedGradientDemo> {
int _gradientIndex = 0;
final List<GradientConfig> _gradients = [
PresetGradients.sunset,
PresetGradients.ocean,
PresetGradients.fire,
PresetGradients.nature,
];
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
setState(() {
_gradientIndex = (_gradientIndex + 1) % _gradients.length;
});
},
child: AnimatedContainer(
duration: Duration(milliseconds: 500),
curve: Curves.easeInOut,
width: 200,
height: 200,
decoration: BoxDecoration(
gradient: _gradients[_gradientIndex].toGradient(),
borderRadius: BorderRadius.circular(16),
),
child: Center(
child: Text('Tap to change', style: TextStyle(color: Colors.white)),
),
),
);
}
}
Creating a Custom Gradient Widget
// Custom widget that applies a gradient overlay on any child
class GradientOverlay extends StatelessWidget {
final Widget child;
final GradientConfig gradient;
final BlendMode blendMode;
const GradientOverlay({
Key? key,
required this.child,
required this.gradient,
this.blendMode = BlendMode.srcOver,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return ShaderMask(
blendMode: blendMode,
shaderCallback: (bounds) => gradient.toGradient().createShader(bounds),
child: child,
);
}
}
// Usage example
GradientOverlay(
gradient: PresetGradients.rainbow,
blendMode: BlendMode.overlay,
child: Image.asset('assets/photo.jpg'),
)
Preset Gradients
The package comes with several preset gradients that you can use out of the box:
PresetGradients.sunset- Orange to pink sunset-like gradientPresetGradients.ocean- Blue to cyan ocean-like gradientPresetGradients.fire- Red to orange fiery gradientPresetGradients.nature- Green to lime nature-themed gradientPresetGradients.rainbow- Full spectrum rainbow gradientPresetGradients.sunrise- Yellow to orange sunrise gradientPresetGradients.space- Deep purple to blue space-like gradientPresetGradients.darkRadial- Dark radial gradient for spotlight effectsPresetGradients.colorWheel- Vibrant color wheel gradient
Gradient Transformations
// Reverse a gradient's direction
final reversedGradient = myGradient.reversed();
// Rotate a gradient
final rotatedGradient = myGradient.rotated(quarterTurns: 1);
// Tint a gradient with a color
final tintedGradient = myGradient.tinted(Colors.red, strength: 0.3);
// Adjust brightness
final brighterGradient = myGradient.withBrightness(1.3);
// Adjust saturation
final saturatedGradient = myGradient.withSaturation(1.5);
API Reference
GradientConfig
GradientConfig({
required List<Color> colors,
GradientType type = GradientType.linear,
GradientDirection direction = GradientDirection.leftToRight,
List<double>? stops,
AlignmentGeometry? center,
double? radius,
TileMode tileMode = TileMode.clamp,
double? startAngle,
double? endAngle,
})
Factory Constructors:
GradientConfig.monochromatic()- Creates a gradient from a single color with varying shadesGradientConfig.complementary()- Creates a gradient using complementary colorsGradientConfig.triadic()- Creates a gradient using triadic color harmonyGradientConfig.fromColor()- Creates a gradient that fades from a color to transparentGradientConfig.angle()- Creates a linear gradient with a specific angleGradientConfig.rainbow()- Creates a rainbow gradient with customizable stepsGradientConfig.mix()- Creates a gradient by mixing two colorsGradientConfig.shade()- Creates a gradient from dark to light shades of a color
GradientContainer
GradientContainer({
required GradientConfig gradient,
Widget? child,
BorderRadius? borderRadius,
double? width,
double? height,
EdgeInsetsGeometry? margin,
EdgeInsetsGeometry? padding,
Alignment? alignment,
BoxBorder? border,
double elevation = 0.0,
Color shadowColor = Colors.black54,
VoidCallback? onTap,
VoidCallback? onLongPress,
bool enableInteractiveEffects = false,
double hoverScale = 1.03,
Duration animationDuration = const Duration(milliseconds: 200),
Clip clipBehavior = Clip.none,
BoxShape shape = BoxShape.rectangle,
Color? backgroundColor,
})
GradientButton
GradientButton({
required GradientConfig gradient,
required String text,
required VoidCallback onPressed,
IconData? icon,
IconPosition iconPosition = IconPosition.left,
double height = 50.0,
double? width,
BorderRadius? borderRadius,
EdgeInsetsGeometry padding = const EdgeInsets.symmetric(horizontal: 16.0),
TextStyle? textStyle,
Color textColor = Colors.white,
bool isLoading = false,
Color loadingColor = Colors.white,
double loadingSize = 24.0,
double elevation = 0.0,
bool animateOnPress = false,
double pressedScale = 0.95,
})
GradientText
GradientText(
String text, {
required GradientConfig gradient,
required TextStyle style,
TextAlign textAlign = TextAlign.center,
TextDirection? textDirection,
int? maxLines,
TextOverflow overflow = TextOverflow.clip,
bool selectable = false,
bool softWrap = true,
double? textScaleFactor,
List<Shadow>? shadows,
double? letterSpacing,
double? wordSpacing,
double? height,
String? semanticsLabel,
bool animateGradient = false,
Duration animationDuration = const Duration(milliseconds: 3000),
double? width,
bool blurEffect = false,
double blurSigma = 1.0,
bool gradientShadow = false,
Offset gradientShadowOffset = const Offset(2.0, 2.0),
})
Performance Considerations
For optimal performance:
- Memory Usage: Avoid creating new
GradientConfiginstances repeatedly in build methods - Animation: Use
animateGradientproperties sparingly as they can impact performance - Complex UI: Be cautious when using multiple gradient widgets in scrolling lists
Troubleshooting
Common Issues
-
Gradients not appearing:
- Ensure container has non-zero dimensions (width/height)
- Check that colors list contains at least 2 colors
-
Animation jank:
- Reduce the number of simultaneously animated gradients
- Increase animation duration for smoother transitions
-
Text visibility issues:
- Ensure text color contrasts well with gradient colors
- Use
shadowproperty to improve readability
License
This package is licensed under the MIT License - see the LICENSE file for details.
Contact
If you have any questions, suggestions, or issues, please open an issue on GitHub: https://github.com/KANAGARAJ-M/gradient_color_and_styles/issues