mayr_events 2.1.1 copy "mayr_events: ^2.1.1" to clipboard
mayr_events: ^2.1.1 copied to clipboard

A lightweight, expressive event and listener system for Dart, inspired by Laravel's event architecture.

example/lib/main.dart

// ignore_for_file: avoid_print

import 'dart:async';
import 'package:mayr_events/mayr_events.dart';

// ============================================================================
// 1. Define Events
// ============================================================================

/// Event fired when a user registers
class UserRegisteredEvent extends MayrEvent {
  final String userId;
  final String email;

  const UserRegisteredEvent(this.userId, this.email);

  /// Example of event-level beforeHandle hook
  @override
  Future<void> Function(MayrEvent, MayrListener)? get beforeHandle {
    return (event, listener) async {
      print('  [Event Hook] About to handle user registration');
    };
  }
}

/// Event fired when an order is placed
class OrderPlacedEvent extends MayrEvent {
  final String orderId;
  final double total;

  const OrderPlacedEvent(this.orderId, this.total);
}

// ============================================================================
// 2. Define Listeners
// ============================================================================

/// Sends welcome email when user registers
class SendWelcomeEmailListener extends MayrListener<UserRegisteredEvent> {
  @override
  Future<void> handle(UserRegisteredEvent event) async {
    // Simulate sending email
    await Future.delayed(const Duration(milliseconds: 500));
    print('โœ… Welcome email sent to ${event.email}');
  }
}

/// Tracks analytics for user registration
class UserAnalyticsListener extends MayrListener<UserRegisteredEvent> {
  @override
  Future<void> handle(UserRegisteredEvent event) async {
    print('๐Ÿ“Š Analytics: New user registered - ${event.userId}');
  }
}

/// Processes order and updates inventory
class ProcessOrderListener extends MayrListener<OrderPlacedEvent> {
  @override
  Future<void> handle(OrderPlacedEvent event) async {
    await Future.delayed(const Duration(milliseconds: 300));
    print('๐Ÿ“ฆ Order ${event.orderId} processed - Total: \$${event.total}');
  }
}

// ============================================================================
// 3. Setup Events
// ============================================================================

void setupEvents() {
  // Register listeners
  MayrEvents.on<UserRegisteredEvent>(SendWelcomeEmailListener());
  MayrEvents.on<UserRegisteredEvent>(UserAnalyticsListener());
  MayrEvents.on<OrderPlacedEvent>(ProcessOrderListener());

  // Register global beforeHandle hook
  MayrEvents.beforeHandle('logger', (event, listener) async {
    print(
      '[${DateTime.now().toIso8601String()}] '
      '${listener.runtimeType} handling ${event.runtimeType}',
    );
  });

  // Register global error handler
  MayrEvents.onError('error_logger', (event, error, stack) async {
    print('[ERROR] ${event.runtimeType} failed: $error');
  });

  // Register shouldHandle validator
  MayrEvents.shouldHandle('validator', (event) {
    // Example: only handle events during business hours (always true for demo)
    return true;
  });
}

// ============================================================================
// 4. Main Application
// ============================================================================

Future<void> main() async {
  print('๐Ÿงช Mayr Events Example\n');

  // Setup events - this can be done anywhere before firing events
  setupEvents();

  // Example 1: Fire user registered event
  print('========================================');
  print('๐Ÿ”ฅ Firing UserRegisteredEvent');
  print('========================================');
  await MayrEvents.fire(
    const UserRegisteredEvent('user123', 'user@example.com'),
  );

  print('\n');

  // Example 2: Fire order placed event
  print('========================================');
  print('๐Ÿ”ฅ Firing OrderPlacedEvent');
  print('========================================');
  await MayrEvents.fire(const OrderPlacedEvent('ORD001', 99.99));

  print('\n');

  // Example 3: Demonstrate removing handlers
  print('========================================');
  print('๐Ÿ”ฅ Removing logger and firing again');
  print('========================================');
  MayrEvents.removeBeforeHandler('logger');
  await MayrEvents.fire(
    const UserRegisteredEvent('user456', 'another@example.com'),
  );

  print('\nโœ… Example completed!');
}
0
likes
160
points
359
downloads

Publisher

verified publishermayrlabs.com

Weekly Downloads

A lightweight, expressive event and listener system for Dart, inspired by Laravel's event architecture.

Homepage
Repository (GitHub)
View/report issues
Contributing

Topics

#event #listener #architecture #dart #pub

Documentation

Documentation
API reference

License

MIT (license)

More

Packages that depend on mayr_events