registerPlugin method

void Function() registerPlugin(
  1. SlotPlugin<TSlot, TData> plugin
)

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);
  };
}