Skip to content

iamtoricool/fdevs_pops

Repository files navigation

fdevs_pops

A powerful and flexible Flutter package for managing overlays such as dialogs, snackbars, and custom overlays with unique identifiers. It simplifies overlay management by allowing multiple overlays to coexist, providing easy show/dismiss functionality, and supporting auto-hide capabilities.

Features

  • Unique Overlay Management: Assign unique IDs to each overlay for precise control over showing, dismissing, and checking their status.
  • Multiple Overlay Support: Handle multiple overlays simultaneously without conflicts.
  • Dialog Support: Built-in extensions for displaying modal dialogs with customizable barriers and auto-hide options.
  • Snackbar Support: Convenient methods for showing snackbars at the bottom of the screen with auto-hide functionality.
  • Custom Overlays: Create fully customizable overlays with alignment, barriers, and positioning options.
  • Async Results: Overlays can return results asynchronously, making it easy to handle user interactions.
  • Auto-Hide: Optional auto-hide durations for overlays to disappear automatically.
  • Queue Management: Internal queue system to manage overlay order and lifecycle.
  • Easy Initialization: Simple setup with a navigator key for seamless integration into Flutter apps.

Getting started

Prerequisites

  • Flutter SDK: ^1.17.0
  • Dart SDK: ^3.9.2

Installation

Add fdevs_pops to your pubspec.yaml:

dependencies:
  fdevs_pops: ^0.0.1

Then run:

flutter pub get

Setup

Initialize the FPops manager in your app's root widget by wrapping your MaterialApp with FPops.init() and providing a GlobalKey<NavigatorState>:

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return FPops.init(
      rootNavigatorKey: _navigatorKey,
      child: MaterialApp(
        navigatorKey: _navigatorKey,
        home: const HomePage(),
      ),
    );
  }
}

Usage

Showing a Dialog

final result = await FPops.I.showDialog<String>(
  id: 'my_dialog',
  builder: (_) => AlertDialog(
    title: Text('Confirm Action'),
    content: Text('Are you sure you want to proceed?'),
    actions: [
      TextButton(
        onPressed: () => FPops.I.dismiss('my_dialog', 'cancelled'),
        child: Text('Cancel'),
      ),
      ElevatedButton(
        onPressed: () => FPops.I.dismiss('my_dialog', 'confirmed'),
        child: Text('Confirm'),
      ),
    ],
  ),
  barrierDismissible: true,
  autoHideDuration: null, // No auto-hide for dialogs
);

if (result == 'confirmed') {
  // Handle confirmation
}

Showing a Snackbar

await FPops.I.showSnackBar(
  id: 'my_snackbar',
  builder: (_) => Container(
    padding: EdgeInsets.all(16),
    color: Colors.green,
    child: Text('Operation completed successfully!'),
  ),
  autoHideDuration: Duration(seconds: 3),
);

Showing a Custom Overlay

await FPops.I.showCustom(
  id: 'my_custom_overlay',
  builder: (_) => Container(
    width: 200,
    height: 200,
    color: Colors.blue,
    child: Center(child: Text('Custom Overlay')),
  ),
  alignment: Alignment.topRight,
  barrierDismissible: true,
  barrierColor: Colors.black.withOpacity(0.5),
  autoHideDuration: Duration(seconds: 5),
);

Checking Overlay Status

bool isOpen = FPops.I.isOverlayOpen('my_dialog');

Dismissing an Overlay Manually

FPops.I.dismiss('my_dialog');

Clearing All Overlays

FPops.I.clearAll();

For more detailed examples, see the /example folder.

API Reference

FPops Class

The main class for managing overlays.

Methods

  • static Widget init({required GlobalKey<NavigatorState> rootNavigatorKey, required Widget child}): Initializes the FPops manager.
  • void show(String id, OverlayConfig config, {Completer<Object?>? completer}): Shows an overlay with the given ID and configuration.
  • void dismiss<T>(String id, [T? result]): Dismisses the overlay with the given ID and optional result.
  • bool isOverlayOpen(String id): Checks if an overlay with the given ID is currently active.
  • void clearAll(): Clears all active overlays.

Extensions

FPopsDialogExtension
  • Future<T?> showDialog<T>({required String id, required WidgetBuilder builder, bool barrierDismissible = true, Color? barrierColor = Colors.black54, Duration? autoHideDuration}): Shows a dialog overlay.
FPopsSnackBarExtension
  • Future<T?> showSnackBar<T>({required String id, required WidgetBuilder builder, Duration? autoHideDuration = Durations.medium4}): Shows a snackbar overlay.
FPopsCustomExtension
  • Future<T?> showCustom<T>({required String id, required WidgetBuilder builder, Alignment alignment = Alignment.center, bool barrierDismissible = false, Color? barrierColor, Duration? autoHideDuration}): Shows a custom overlay.

OverlayType Enum

  • dialog: For dialog overlays.
  • snackbar: For snackbar overlays.
  • custom: For custom overlays.

OverlayConfig Class

  • OverlayConfig({required WidgetBuilder builder, required OverlayType type}): Configuration for an overlay.

Additional information

Contributing

Contributions are welcome! Please feel free to submit a Pull Request or open an Issue on GitHub.

Issues

If you encounter any issues or have feature requests, please file them on the GitHub Issues page.

License

This package is licensed under the LICENSE file.

Changelog

See CHANGELOG.md for version history and updates.

Resources

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published