Recent Roll Drawer

A Flutter package providing a unique roll drawer with screen previews and customizable animations.

Features

  • Roll Drawer - Unique paper roll animation effect
  • Screen Previews - Display recent screens as mini previews in drawer
  • Simple Mode - Option to use standard slide-in drawer
  • Customizable - Control animation, colors, and behavior
  • Easy to Use - Simple API with sensible defaults

Installation

Add to your pubspec.yaml:

dependencies:
  recent_roll_drawer: ^1.0.0

Then run:

flutter pub get

Quick Start

Basic Usage

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

class MyApp extends StatelessWidget {
  final RollDrawerController _drawerController = RollDrawerController();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: RollDrawer(
        controller: _drawerController,
        drawer: Drawer(
          child: ListView(
            children: [
              DrawerHeader(
                child: Text('Menu'),
              ),
              ListTile(
                title: Text('Home'),
                onTap: () => _drawerController.close(),
              ),
            ],
          ),
        ),
        child: Scaffold(
          appBar: AppBar(
            leading: IconButton(
              icon: Icon(Icons.menu),
              onPressed: () => _drawerController.open(),
            ),
          ),
          body: Center(
            child: Text('Your Content'),
          ),
        ),
      ),
    );
  }
}

With Screen Previews

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

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final RollDrawerController _drawerController = RollDrawerController();
  final ScreenStackController _screenStackController = ScreenStackController();
  
  Widget _currentScreen = HomeScreen();

  void _navigateToScreen(Widget screen, String title) {
    setState(() {
      _currentScreen = screen;
    });
    
    _screenStackController.pushScreen(
      ScreenPreview(
        title: title,
        icon: Icon(Icons.home),
        color: Colors.blue,
        previewWidget: screen,
        onTap: () {
          _navigateToScreen(screen, title);
          _drawerController.close();
        },
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: RollDrawer(
        controller: _drawerController,
        screenStackController: _screenStackController,
        drawer: Drawer(
          child: ListView(
            children: [
              DrawerHeader(child: Text('Menu')),
              ListTile(
                title: Text('Home'),
                onTap: () {
                  _navigateToScreen(HomeScreen(), 'Home');
                  _drawerController.close();
                },
              ),
            ],
          ),
        ),
        child: _currentScreen,
      ),
    );
  }
}

Configuration Options

RollDrawer Properties

RollDrawer(
  child: Widget,                    // Required: Main content
  drawer: Widget,                   // Required: Drawer content
  controller: RollDrawerController?, // Optional: Controller for programmatic control
  screenStackController: ScreenStackController?, // Optional: For screen previews
  drawerWidth: 300.0,              // Drawer width (default: 300.0)
  animationDuration: Duration(milliseconds: 600), // Animation duration
  animationCurve: Curves.easeInOutCubic, // Animation curve
  cylinderWidth: 45.0,             // Cylinder width for roll effect
  drawerPadding: EdgeInsets.zero,  // Padding inside drawer
  showScreenPreviews: true,         // Show screen previews
  maxScreenPreviews: 5,             // Max previews to show
  screenPreviewBackgroundColor: Colors.black, // Preview section background
  enableAnimation: true,            // Enable/disable animation
  enableRollEffect: true,           // Enable roll effect (false = simple slide)
  onDrawerChanged: () {},          // Callback when drawer state changes
)

RollDrawerController

final controller = RollDrawerController();

controller.open();    // Open drawer
controller.close();   // Close drawer
controller.toggle(); // Toggle drawer state
bool isOpen = controller.isOpen; // Check if open

ScreenStackController

final stackController = ScreenStackController(maxScreens: 10);

stackController.pushScreen(ScreenPreview(...)); // Add screen
stackController.removeScreen('Title');         // Remove screen
stackController.clearAll();                    // Clear all screens
stackController.screens;                       // Get all screens

ScreenPreview

ScreenPreview(
  title: 'Screen Title',           // Required: Screen title
  icon: Icon(Icons.home),          // Optional: Icon widget
  color: Colors.blue,              // Optional: Fallback color
  previewWidget: Widget,            // Optional: Actual screen widget for preview
  onTap: () {},                    // Optional: Tap callback
  timestamp: DateTime.now(),       // Optional: Timestamp
)

Examples

Simple Slide Drawer (No Roll Effect)

RollDrawer(
  enableRollEffect: false,
  drawer: Drawer(...),
  child: Scaffold(...),
)

Disable Animation

RollDrawer(
  enableAnimation: false,
  drawer: Drawer(...),
  child: Scaffold(...),
)

Custom Colors

RollDrawer(
  screenPreviewBackgroundColor: Colors.black.withOpacity(0.3),
  drawer: Drawer(...),
  child: Scaffold(...),
)

Example App

See the complete example in the /example folder:

cd example
flutter run

License

MIT License