smooth_onboarding 0.3.0 copy "smooth_onboarding: ^0.3.0" to clipboard
smooth_onboarding: ^0.3.0 copied to clipboard

A reusable, animated Flutter onboarding package with first-launch persistence and dark mode support.

smooth_onboarding #

pub package likes Buy Me a Coffee

A smooth, production-ready onboarding UI for Flutter apps.

Smooth animations. Simple API. Production-ready.

Build beautiful onboarding flows in minutes, with smooth animations and zero boilerplate.

Light Mode Dark Mode
Onboarding Preview Onboarding Preview Dark

Demo #

See it in action: the example app uses built-in shapes and icons to stay lightweight while providing a sleek, smooth onboarding experience.


Why smooth_onboarding? #

Most onboarding packages are either too basic or too rigid.

smooth_onboarding focuses on:

  • Clean, modern UI out of the box
  • Smooth, production-level animations
  • Simple API that integrates easily in real apps

Features #

  • Animated progress bar with page-based progress
  • Optional back button that appears from the second page onward
  • Floating primary button that changes from Next to Get started on the last page
  • Built-in haptic feedback on primary and secondary actions
  • Per-page primary action callback for login, paywall, micro-setup, or notification flows
  • Per-page text-only secondary action for skippable steps like Salta
  • First-launch persistence via SharedPreferences
  • Dark mode aware default styling
  • Fully customizable page content with any widget
  • Customizable labels (next, done, back tooltip)
  • Optional back button toggle (showBackButton)
  • Configurable animation durations and progress semantics label
  • Configurable page transition style: horizontal slide, shared-axis, or fade
  • Modern completion animation that slides the whole screen upward
  • External reload trigger for programmatic onboarding reset

Installation #

dependencies:
  smooth_onboarding: ^0.3.0

Usage #

import 'package:flutter/material.dart';
import 'package:smooth_onboarding/smooth_onboarding.dart';

class AppRoot extends StatelessWidget {
  const AppRoot({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: OnboardingGate(
        storageKey: OnboardingStorage.defaultStorageKey,
        pages: const [
          OnboardingPage(
            title: 'Welcome',
            body: Text('Discover the app in a few steps.'),
          ),
          OnboardingPage(
            title: 'Customize',
            body: Icon(Icons.palette_outlined, size: 72),
          ),
          OnboardingPage(
            title: 'Ready',
            body: Text('Initial setup is complete.'),
          ),
        ],
        child: const Scaffold(
          body: Center(child: Text('Main app content')),
        ),
      ),
    );
  }
}

If you want to control the first-launch check yourself, use OnboardingStorage:

final showOnboarding = await OnboardingStorage.shouldShowOnboarding();
if (showOnboarding) {
  // Show onboarding.
}

Customization #

You can customize texts, colors and layout through page data, labels and theme:

OnboardingGate(
  pages: pages,
  showBackButton: true,
  nextButtonLabel: 'Next',
  doneButtonLabel: 'Get started',
  backButtonTooltip: 'Back',
  progressSemanticsLabel: 'Onboarding progress',
  progressAnimationDuration: const Duration(milliseconds: 360),
  contentAnimationDuration: const Duration(milliseconds: 300),
  contentAnimationCurve: Curves.easeOutCubic,
  pageTransitionType: OnboardingPageTransitionType.slideHorizontal,
  buttonLabelAnimationDuration: const Duration(milliseconds: 240),
  closeAnimationDuration: const Duration(milliseconds: 420),
  closeAnimationCurve: Curves.easeInCubic,
  theme: const OnboardingTheme(
    backgroundColor: Colors.white,
    progressColor: Colors.blue,
    buttonColor: Colors.blue,
    progressHeight: 8,
  ),
  child: const HomePage(),
)

Per-page custom CTA example (login with skip):

OnboardingPage(
  title: 'Salva tutto in sicurezza',
  body: const Text('Accedi per sincronizzare su tutti i dispositivi.'),
  buttonLabel: 'Continua con Google',
  secondaryButtonLabel: 'Salta',
  onPrimaryPressed: () async {
    // Trigger your Google sign-in flow.
  },
)

Per-page custom CTA example (enable notifications):

OnboardingPage(
  title: 'Get notified in time?',
  body: const Text('Enable notifications to receive reminders.'),
  buttonLabel: 'Enable notifications',
  onPrimaryPressed: () async {
    // Trigger your real notifications permission flow here.
  },
)

Reset and force the gate to re-check:

await OnboardingStorage.reset();
setState(() {
  reloadToken++;
});

Then pass reloadTrigger: reloadToken to OnboardingGate.

Example behavior #

The package is designed around these defaults:

  • White background in light mode
  • Dark gray background in dark mode
  • Blue progress bar and blue primary button
  • Horizontal slide transitions between pages
  • Full-screen close animation that moves the onboarding upward
  • Small back arrow with a compact hit area

Used in production #

This package is used in real Flutter applications.

Development #

For local checks, run the usual Flutter commands from the package root:

flutter analyze
flutter test

Author #

Created by Elia Zavatta.

I build production-ready Flutter apps and reusable UI components.

LLM and SEO keywords #

Flutter onboarding, first launch flow, onboarding gate, onboarding persistence, animated onboarding pages, login onboarding, paywall onboarding, skippable onboarding.

License #

MIT

1
likes
160
points
331
downloads

Documentation

API reference

Publisher

verified publishereliazavatta.it

Weekly Downloads

A reusable, animated Flutter onboarding package with first-launch persistence and dark mode support.

Repository (GitHub)
View/report issues

Topics

#onboarding #flutter #ui #animation #first-launch

License

MIT (license)

Dependencies

chiclet, flutter, shared_preferences

More

Packages that depend on smooth_onboarding