registerPlugin method
Registers every slot contribution from plugin.
The registration is validated up front so partial registration cannot succeed.
Implementation
void Function() registerPlugin(SlotPlugin<TSlot, TData> plugin) {
if (plugin.pluginId.isEmpty) {
throw ArgumentError.value(
plugin.pluginId,
'plugin.pluginId',
'Must not be empty.',
);
}
if (plugin.slots.isEmpty) {
throw ArgumentError.value(
plugin.slots,
'plugin.slots',
'Must not be empty.',
);
}
for (final entry in plugin.slots.entries) {
if (_registrations.any(
(registration) =>
registration.pluginId == plugin.pluginId &&
registration.slot == entry.key,
)) {
throw StateError(
'Slot contribution "${plugin.pluginId}" is already registered for '
'slot "${entry.key}".',
);
}
}
final registrations = plugin.slots.entries
.map(
(entry) => _SlotRegistration<TSlot, TData>(
pluginId: plugin.pluginId,
slot: entry.key,
order: entry.value.order,
registrationOrder: _nextRegistrationOrder++,
builder: entry.value.builder,
),
)
.toList(growable: false);
_registrations.addAll(registrations);
_notifyListeners();
var disposed = false;
return () {
if (disposed) return;
disposed = true;
unregisterPlugin(plugin.pluginId);
};
}