Skip to content

Instantly share code, notes, and snippets.

@gdugas
Created November 20, 2013 13:16
Show Gist options
  • Save gdugas/7563014 to your computer and use it in GitHub Desktop.
Save gdugas/7563014 to your computer and use it in GitHub Desktop.
Dart event mixin
abstract class Events {
Map _events;
on(String events, Function callback, [Map datas]) {
_events == null ? (_events = {}) : null;
var eventsList = _splitEvents(events);
for (int i = 0; i < eventsList.length; i++) {
String event = eventsList[i];
_events[event] == null ? (_events[event] = []): null;
_events[event].add([callback, datas]);
}
}
off(String events, [Function callback]) {
_events == null ? (_events = {}) : null;
var eventsList = _splitEvents(events);
for (var i = 0; i < eventsList.length; i++) {
String event = eventsList[i];
if (_events[event] == null) {
// Event not registered: nothing to do
continue;
} else if (callback == null) {
// Callback not specified: delete full event
_events[event].clear();
} else {
// Delete only event with specified callback
List newHandlers = [];
for (var j = 0; j < _events[event].length; j++) {
var handler = _events[event][j];
if (handler[0] != callback) {
newHandlers.add(handler);
}
}
_events[event] = newHandlers;
}
}
}
fire(String event, [Map args]) {
if (_events == null || _events[event] == null) {
return;
}
for (var i = 0; i < _events[event].length; i++) {
var handler = _events[event][i];
handler[0](args, handler[1]);
}
}
List<String> _splitEvents(String events) {
var spaces = new RegExp(r'\s+');
List<String> splitteds = events.replaceAll(spaces, ' ')
.trim()
.split(' ');
List<String> formattedEvents = [];
for (int i = 0; i < splitteds.length; i++) {
if (! formattedEvents.contains(splitteds[i])) {
formattedEvents.add(splitteds[i]);
}
}
return formattedEvents;
}
}
@gdugas
Copy link
Author

gdugas commented Nov 20, 2013

Usage example

class Foo extends Object with Events {
    bar (Map args, Map datas) {
        print(args);
        print(datas);
    }
}

Foo foo = new Foo();

// Registering event
foo.on('launchbar other event', foo.bar, {'data1': 'bar1', 'data2': 'bar2'});

// Disable previous registered events
foo.off('other', foo.bar);
foo.off('event');

// Launch specified event with followed arguments
foo.fire('launchbar', {'arg1': 'value1', 'arg2': 'value2'});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment