save_points_showcaseview 1.6.4
save_points_showcaseview: ^1.6.4 copied to clipboard
A beautiful, modern showcase coach overlay for Flutter with smooth animations, glassmorphism effects, and step-by-step guided tours.
Showcase Coach #
Modern, design-forward showcase coach overlays for Flutter with smooth motion, glassmorphism, and sensible validation so you can guide users through product tours with confidence.
Preview #
![Showcase Coach Preview]
🚀 Try it live → Interactive Demo #
Why use Showcase Coach? #
- Design-first: Glassmorphism, elevated cards, and balanced typography that fit Material 3.
- Safe by default: Duplicate key detection, visibility checks, and user-friendly error dialogs with actionable guidance.
- Flexible logic: Per-step and global conditions (
shouldShow/showIf) plus smart scrolling. - Motion-aware: Reduced-motion mode, customizable transition animations, and comprehensive animation controls.
- Multiple overlay styles: Modern (default), classic, and compact onboarding styles via
overlayStyle. - Rich visual effects: Ripple, shimmer, particle effects, rotation, and customizable glow/shadow effects.
- Accessible: Built-in accessibility support with semantic labels, proper tap targets, and keyboard navigation.
- Well-documented: Comprehensive API documentation with examples and best practices.
- Drop-in: Simple API that works with any widget that has a
GlobalKey. - Developer-friendly: Debug mode, haptic feedback, auto-advance, and extensive customization options.
Installation #
Add to pubspec.yaml:
dependencies:
save_points_showcaseview: ^1.6.4
Then install:
flutter pub get
Quick start (3 steps) #
- Create keys:
final _buttonKey = GlobalKey();
final _cardKey = GlobalKey();
- Attach keys:
FilledButton(key: _buttonKey, onPressed: () {}, child: const Text('Click me'));
Card(key: _cardKey, child: const Text('Important card'));
- Show the coach:
await ShowcaseCoach.show(
context,
steps: [
CoachStep(
targetKey: _buttonKey,
title: 'Welcome!',
description: ['This is your first step.'],
),
CoachStep(
targetKey: _cardKey,
title: 'Feature Card',
description: [
'This card contains important information.',
'Swipe to see more tips.',
],
),
],
);
Full example #
import 'package:flutter/material.dart';
import 'package:save_points_showcaseview/save_points_showcaseview.dart';
class MyWidget extends StatefulWidget {
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
final _buttonKey = GlobalKey();
final _cardKey = GlobalKey();
Future<void> _startTour() async {
await ShowcaseCoach.show(
context,
steps: [
CoachStep(
targetKey: _buttonKey,
title: 'Action Button',
description: ['Tap this button to perform an action.'],
),
CoachStep(
targetKey: _cardKey,
title: 'Information Card',
description: ['This card displays important information.'],
),
],
onSkip: () => debugPrint('Tour skipped'),
onDone: () => debugPrint('Tour completed'),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
FilledButton(
key: _buttonKey,
onPressed: _startTour,
child: const Text('Start Tour'),
),
Card(
key: _cardKey,
child: const Padding(
padding: EdgeInsets.all(12),
child: Text('Card content'),
),
),
],
),
);
}
}
Configuration highlights #
Basic Configuration #
ShowcaseCoachConfiglets you tune:primaryColor,buttonColor,fontFamilytitleStyle,bodyStyle,buttonTextStylecardStyle:glass(default) ornormaloverlayStyle:modern(default),classic, orcompactoverlayTintOpacityreduceMotion: disables blur/heavy effectsshowProgressIndicator: show step progress (default:true)skipButtonText: global text for skip buttons (can be overridden per-step or per-tour)nextButtonText: global text for next buttons (can be overridden per-step or per-tour)
Overlay styles #
ShowcaseOverlayStyle.modern: gradient overlay + inline Skip/Next (default)ShowcaseOverlayStyle.classic: dark overlay + speech-bubble tooltip + Skip fixed bottom-leftShowcaseOverlayStyle.compact: dark overlay + smaller bubble near target + Skip fixed bottom-left
ShowcaseCoachConfig(
overlayStyle: ShowcaseOverlayStyle.classic,
primaryColor: Color(0xFFE53935),
buttonColor: Color(0xFFE53935),
)
Visual Effects #
- Ripple Effect:
enableRippleEffect- Expanding circular ripples - Shimmer Effect:
enableShimmerEffect- Shimmer animation on borders - Particle Effect:
enableParticleEffect- Floating particles around highlights - Glow & Shadow:
glowIntensity,shadowIntensity(0.0-2.0 range) - Border Styles:
borderStyle-solid,dashed, ordotted - Border Customization:
borderWidth,borderRadius - Highlight Shapes:
highlightShape-roundedRectangle,circle, orrectangle
Animation Customization #
- Transition Animations:
enableTransitions: enable/disable (defaults based onreduceMotion)transitionDuration: global duration for all transitionstransitionCurve: global curve for all transitions- Individual durations:
backdropTransitionDuration,gradientTransitionDuration,highlightTransitionDuration,cardTransitionDuration
- Fade Animations:
fadeAnimationDuration,fadeAnimationCurve - Scale Animations:
scaleAnimationDuration,scaleAnimationCurve,scaleAnimationRange - Slide Animations:
slideAnimationDuration,slideAnimationCurve,slideAnimationOffset - Rotation Animation:
enableRotationAnimation,rotationAnimationSpeed,rotationAngle - Pulse & Bounce:
pulseAnimationSpeed,bounceIntensity - Animation Delays:
animationDelay,staggerAnimationDelay,enableStaggerAnimations - Animation Presets:
animationPreset-defaultPreset,smooth,bouncy,quick,dramatic - Animation Direction:
animationDirection-normal,reverse,alternate
Interaction & Behavior #
- Haptic Feedback:
enableHapticFeedback,hapticFeedbackType(light,medium,heavy) - Auto-Advance:
enableAutoAdvance(per-stepautoAdvanceAfterduration) - Touch Outside:
dismissOnTapOutside- dismiss tour by tapping outside - Debug Mode:
debugMode- visual debugging information
Per-Step Options #
shouldShow: function returning bool (priority)showIf: simple bool (defaults to true)onNext,onSkip: custom callbacks per stepnextButtonText,skipButtonText: custom button labels (highest priority - overrides config and tour-level)showSkipButton: hide skip button for critical stepsautoAdvanceAfter: auto-advance duration for this stepleading: custom icon/widget to displayimageUrl,imageAsset: images in tooltip cards
Button Text Customization #
Button text can be customized at three levels (priority order):
- Step-level (
CoachStep.nextButtonText/skipButtonText) - highest priority - Tour-level (
ShowcaseCoach.show()parameters) - medium priority - Config-level (
ShowcaseCoachConfig.nextButtonText/skipButtonText) - default for all tours - Built-in defaults - "Next"/"Done" and "Skip" if none specified
Advanced Configuration Examples #
Visual Effects
ShowcaseCoachConfig(
// Enable visual effects
enableRippleEffect: true,
enableShimmerEffect: true,
enableParticleEffect: true,
// Customize glow and shadows
glowIntensity: 1.5,
shadowIntensity: 0.8,
// Border customization
borderStyle: HighlightBorderStyle.dashed,
borderWidth: 4.0,
borderRadius: 16.0,
highlightShape: HighlightShape.circle,
)
Animation Customization
ShowcaseCoachConfig(
// Transition animations
enableTransitions: true,
transitionDuration: Duration(milliseconds: 300),
transitionCurve: Curves.easeInOut,
// Fade animations
fadeAnimationDuration: Duration(milliseconds: 500),
fadeAnimationCurve: Curves.easeInOut,
// Scale animations
scaleAnimationDuration: Duration(milliseconds: 800),
scaleAnimationCurve: Curves.elasticOut,
scaleAnimationRange: ScaleRange(0.5, 1.2),
// Slide animations
slideAnimationDuration: Duration(milliseconds: 600),
slideAnimationCurve: Curves.easeInOutBack,
slideAnimationOffset: Offset(50, 0),
// Rotation animation
enableRotationAnimation: true,
rotationAnimationSpeed: 1.5,
rotationAngle: 15.0,
// Pulse and bounce
pulseAnimationSpeed: 1.2,
bounceIntensity: 1.5,
// Animation delays and presets
animationDelay: Duration(milliseconds: 200),
staggerAnimationDelay: Duration(milliseconds: 100),
enableStaggerAnimations: true,
animationPreset: AnimationPreset.bouncy,
animationDirection: AnimationDirection.alternate,
)
Interaction & Behavior
ShowcaseCoachConfig(
// Haptic feedback
enableHapticFeedback: true,
hapticFeedbackType: HapticFeedbackType.medium,
// Auto-advance
enableAutoAdvance: true,
// Touch outside to dismiss
dismissOnTapOutside: true,
// Debug mode
debugMode: true,
// Custom button text (global defaults)
skipButtonText: 'Maybe Later',
nextButtonText: 'Continue',
)
Per-Step Customization
CoachStep(
targetKey: _buttonKey,
title: 'Action Button',
description: ['Tap this button to perform an action.'],
// Custom callbacks
onNext: () => print('Moving to next step'),
onSkip: () => print('Skipping step'),
// Custom button text (overrides config and tour-level)
nextButtonText: 'Continue',
skipButtonText: 'Maybe Later',
showSkipButton: true,
// Auto-advance
autoAdvanceAfter: Duration(seconds: 5),
// Visual content
leading: Icon(Icons.settings, size: 48),
imageUrl: 'https://example.com/screenshot.png',
// or
imageAsset: 'assets/images/guide.png',
)
Tour-Level Button Text Override
await ShowcaseCoach.show(
context,
steps: steps,
// Override button text for this entire tour
skipButtonText: 'Not Now',
nextButtonText: 'Got it!',
config: ShowcaseCoachConfig(
// Config-level defaults (used if not overridden)
skipButtonText: 'Maybe Later',
nextButtonText: 'Continue',
),
);
Validation and safety #
- Duplicate GlobalKey detection before showing with clear error messages.
- Visibility checks ensure targets are attached and scroll into view automatically.
- User-friendly error dialogs instead of silent failures or crashes.
- Comprehensive error messages with actionable guidance and code examples.
- Retry logic for widgets that may not be immediately available.
- Debug mode for visualizing key bounds and validation status.
Accessibility #
- Semantic labels for screen readers on all interactive elements.
- Minimum tap target sizes (48x48) for better touch accessibility.
- Proper button semantics for assistive technologies.
- Full keyboard navigation support (arrow keys, Enter, Escape).
- Reduced motion support via
reduceMotionflag. - Haptic feedback for tactile confirmation (optional).
Tips & best practices #
- Wait for layout before showing:
WidgetsBinding.instance.addPostFrameCallback((_) {
ShowcaseCoach.show(context, steps: steps);
});
-
Unique keys: every step needs its own
GlobalKey. -
Concise copy: short titles and descriptions improve completion.
-
Respect motion: use
reduceMotion: truewhere needed, or customize transition animations withenableTransitionsand duration/curve options. -
Accessibility: The library includes built-in accessibility support, but ensure your target widgets are also accessible.
-
Visual effects: Use effects sparingly - too many effects can be overwhelming. Start with subtle effects and increase intensity as needed.
-
Animation presets: Use
AnimationPresetfor quick styling -smoothfor subtle,bouncyfor playful,quickfor snappy interactions. -
Debug mode: Enable
debugMode: trueduring development to visualize key bounds and troubleshoot issues. -
Haptic feedback: Add haptic feedback for better mobile UX, especially for important steps.
-
Image support: Use
leading,imageUrl, orimageAssetto add visual context to your tooltips.
Troubleshooting #
-
Nothing shows:
- Confirm
Overlay.of(context)is available (e.g., use inside aMaterialApp) - Run after the first frame using
WidgetsBinding.instance.addPostFrameCallback - Check that steps are not filtered out by
shouldShow/showIf
- Confirm
-
Step skipped:
- Check
shouldShow/showIffor that step - Verify the step's
isVisiblegetter returnstrue
- Check
-
Target not found:
- Ensure the widget has a unique
GlobalKeyand is mounted - Check for duplicate keys using
debugMode: true - Verify the widget is visible and not hidden by conditional rendering
- Ensure the widget has a unique
-
Animation errors:
- Ensure
fadeAnimationDurationis not longer thanscaleAnimationDurationwhen using both - Check that
Intervalend values don't exceed 1.0 - Use
reduceMotion: trueif experiencing performance issues
- Ensure
-
Visual effects not showing:
- Check that
reduceMotionis not enabled (disables many effects) - Verify effect flags are set to
truein config - Ensure device supports the effects (some older devices may have limitations)
- Check that
Features Overview #
✨ Visual Effects #
- Ripple effects with expanding circles
- Shimmer/sparkle animations on borders
- Particle effects with floating particles
- Customizable glow and shadow intensities
- Multiple border styles (solid, dashed, dotted)
- Flexible highlight shapes (rounded rectangle, circle, rectangle)
🎬 Animation System #
- Comprehensive animation customization (fade, scale, slide, rotation)
- Animation presets for quick styling
- Animation delays and stagger effects
- Configurable animation directions
- Pulse and bounce intensity controls
🎯 Interaction Features #
- Haptic feedback support
- Auto-advance functionality
- Touch outside to dismiss
- Keyboard navigation
- Step callbacks (
onStepStart,onStepComplete,onStepChanged)
🛠️ Developer Tools #
- Debug mode with visual indicators
- Enhanced error messages with actionable guidance
- Image/icon support in tooltips
- Custom button actions per step
- Progress indicators
♿ Accessibility #
- Screen reader support
- Keyboard navigation
- Reduced motion support
- Proper semantic labels
- Minimum tap target sizes
Version History #
- v1.6.4: Version bump; documentation and example alignment
- v1.6.0: Overlay styles docs (modern/classic/compact), example type selector improvements
- v1.5.0: Customizable button text at config, tour, and step levels
- v1.4.0: Advanced animation customization, rotation, presets, delays
- v1.3.0: Particle effects, shape customization, debug mode, touch outside dismiss
- v1.2.0: Ripple, shimmer, glow/shadow customization, border styles
- v1.1.0: Haptic feedback, auto-advance, image support, improved errors
- v1.0.3: Transition animation controls
- v1.0.2: Comprehensive documentation, accessibility support
- v1.0.0: Initial release
See CHANGELOG.md for detailed version history.
Contributing #
Issues and PRs are welcome! Open one at: https://github.com/m7hamed-dev/save-points-showcaseview/issues
License #
MIT License. See LICENSE for details.