updateData<D2> method

MessageActionDescriptor<M, D, C> updateData<D2>(
  1. D2 update(
    1. MessageHandlerContext<M, D, C> ctx,
    2. D2 data
    ), {
  2. StateKey? forState,
  3. String? label,
})

Updates state data of type D while a message is being handled.

When update function is called, it is provided a MessageHandlerContext, and the current state data value.

enum Messages { increment  }
var countingState = StateKey('counting');
var builder = new StateTreeBuilder(initialState: countingState);

builder.dataState<int>(
  countingState,
  InitialData.value(1),
  (b) {
    b.onMessageValue<Messages>(Messages.increment, (b) {
      // Updates state data as a side effect while the message is handled.
      b.stay(action: b.act.updateData((ctx, counter) => counter + 1));
    });
  });

This action can be labeled when formatting a state tree by providing a label.

Implementation

MessageActionDescriptor<M, D, C> updateData<D2>(
  D2 Function(MessageHandlerContext<M, D, C> ctx, D2 data) update, {
  StateKey? forState,
  String? label,
}) {
  var info = MessageActionInfo(ActionType.updateData, null, D2, label);
  return MessageActionDescriptor(info, (ctx) {
    _log.fine(() => "State '$_forState' is updating data of type $D2");
    var data = ctx.messageContext.dataOrThrow<D2>(forState);
    data.update((current) => update(ctx, current));
  });
}