From bloc-signals
Implements, reviews, tests, and debugs Dart/Flutter code using bloc_signals, bloc_signals_flutter, or otel_bloc_signals. Covers BlocSignal, CubitSignal, providers, builders, selectors, migrations from bloc or Riverpod, and telemetry.
How this skill is triggered — by the user, by Claude, or both
Slash command
/bloc-signals:bloc-signalsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
BlocSignal is young and its API may change between releases. Inspect the consumer project's
BlocSignal is young and its API may change between releases. Inspect the consumer project's
pubspec.yaml, lockfile, imports, and installed package source before editing code. Use this
repository only when the project follows its current branch or the task concerns the repository
itself.
Do not infer API parity from package:bloc, package:flutter_bloc, or Riverpod. BlocSignal uses
signals, has no state stream or provider dependency graph, and does not implement every source
package lifecycle, predicate, or widget API.
This plugin is self-contained for BlocSignal work. When the agent already has skills from
rodydavis/signals.dart, use these optional companions for lower-level Signals tasks:
signals-dart for signals_core primitives and utilities.signals-flutter for Flutter bindings and signal-aware widgets.signals-hooks for flutter_hooks integration.signals-lint for analyzer rules and quick fixes.signals-migration-6-to-7 for Signals 6 to 7 migrations.Do not assume these skills are installed. If they are unavailable, inspect the consumer project's installed Signals source before changing code.
bloc, flutter_bloc, or their widgets.bloc_signals_lint).OtelBlocSignalObserver, span completion gaps, and telemetry data
choices.Load only the references needed for the task.
BlocSignalBase<State> owns state and lifecycle. Use CubitSignal<State> for public methods and
BlocSignal<Event, State> for event dispatch.emit changes state synchronously and skips a value equal to the current state.BlocSignal.add returns void. Synchronous handlers finish before it returns. Async handler
futures are observed for errors but are not returned or cancelled by close.on<E> registration is runtime routing. Duplicate exact types throw StateError; registration
does not give sealed-class exhaustiveness. An onEvent override must call super.onEvent.close returns Future<void>, disposes effects registered through createEffect, and disposes
the internal model. New events are dropped after closure. A post-close emit asserts in debug
mode and returns without updating state in release mode.onChange runs after mutation. Both
local hooks require super; equal emits run neither hook.BlocSignalProvider(create:) is lazy by default, owns its bloc, and closes it. Use lazy: false
for eager creation. BlocSignalProvider.value does not own its bloc.context.watch<T>() tracks provider replacement, not state changes. Use BlocSignalBuilder or a
signals widget to rebuild for state.BlocSignalListener suppresses its initial effect run and supports listenWhen(previous, current). It passes only the current state to the listener callback.BlocSignalObserver is a single slot. Installing a telemetry observer can replace an
existing logger unless the application composes them.Never create an effect or computed during a Flutter build method. Keep its owner and disposal
path explicit.
npx claudepluginhub randalschwartz/blocsignal --plugin bloc-signalsGuides Bloc state management in Flutter/Dart with best practices for Cubit vs Bloc decisions, naming conventions, and testing using blocTest and mocktail.
Builds cross-platform Flutter 3+ apps with Riverpod/Bloc state management, GoRouter navigation, custom widgets, and performance optimization.
Builds cross-platform mobile applications with Flutter 3+ and Dart. Covers widget development, Riverpod/Bloc state management, GoRouter navigation, and performance optimization.