when method

TransitionHandlerWhenBuilder<D, C> when(
  1. FutureOr<bool> condition(
    1. TransitionHandlerContext<D, C> ctx
    ),
  2. void buildTrue(
    1. TransitionHandlerBuilder<D, C> builder
    ), {
  3. String? label,
})

Describes transition behavior that may be run conditionally.

When the transition occurs, the condition function is evaluated. If the function returns true, the behavior described by the buildTrue callback will take place.

The returned TransitionHandlerWhenBuilder may be used to define additional conditional behavior, including a fallback TransitionHandlerWhenBuilder.otherwise condition.

class MyStateData {
  int value = 0;
}
class Payload {
  string op = '';
}

var state1 = StateKey('s1');
var payloadChannel = Channel<Payload>(state1);
var builder = StateTreeBuilder(initialState: state1);

builder.dataState<MyStateData>(
  state1,
  InitialData(() => MyStateData()),
  (b) => b.onEnterFromChannel<Payload>(payloadChannel, (transBuilder) {
    transBuilder
        .when(
          // The payload value is available in ctx.context
          (ctx) => ctx.context.op == 'add',
          (b) => b.updateOwnData((ctx) => ctx.data..value += 1),
        )
        .when(
          (ctx) => ctx.context.op == 'subtract',
          (b) => b.updateOwnData((ctx) => ctx.data..value -= 1),
        )
        .otherwise(
          (b) => b.updateOwnData((ctx) => ctx.data..value = 0),
        );
  }),
);

If more than one condition is defined, the conditions are evaluated in the order they are defined by calls to TransitionHandlerWhenBuilder.when.

Implementation

TransitionHandlerWhenBuilder<D, C> when(
  FutureOr<bool> Function(TransitionHandlerContext<D, C> ctx) condition,
  void Function(TransitionHandlerBuilder<D, C> builder) buildTrue, {
  String? label,
}) {
  var conditions = <TransitionConditionDescriptor<C>>[];
  var whenBuilder = TransitionHandlerWhenBuilder<D, C>._(
    conditions,
    () => TransitionHandlerBuilder<D, C>._(_forState, _log, _makeContext),
  );

  whenBuilder.when(condition, buildTrue, label: label);
  _descriptor = makeWhenTransitionDescriptor(conditions, _makeContext, _log, label);
  return whenBuilder;
}