/beat

State management for Dart and Flutter

Primary LanguageDart

It is not product-ready. You should carefully consider using this package in your production environment.

Beat Station - State management with state machine

This project is my toy project to simplify the state management flows in Flutter and dart. Whole functionalities are heavily inspired by xstate.js. I highly recommend reading the docs of xstate.js.

Go to the Beatly Book, 한국어 문서 for more information.

Roadmap

beat will be gradually improved and polished in the future. I have a kind of roadmap.

State management for Dart-only applications

You can use beat as a Dart's state management system.

State management for Flutter applications

beat provides a set of widgets that will increase your productivity when building your flutter application. beat also provides inspectors for debugging your state machine.

GUI for state machines

Low-coding GUI application for your flutter's state machine.

beat market place

You can share and sell your wonderful state machine.

Real-time collaboration of state machines

Your team can collaborate online in real-time.

Others

I aim to make beat to be a framework for flutter applications. There will be another enhancement in the future including easier network requests, form validation, render/computation separation, and others. I might implement some kind of full-stack dart framework in the future.

Features compatible with xstate.js

A roadmap is as follows, but the order does not matter.

  • Support simple state transition without context
  • Listen to state and context changes
    • addListeners/removeListeners and variations are for state
    • addContextListeners/removeContextListeners is for context
    • stateStream for BeatState, enumStream for your enum state, and contextStream for your data.
  • Map states
  • Execute callback on state change
  • Support reset
  • Support context
    • Initialize with context
    • Get current context
    • assign new context
  • Support transition with an argument
  • Support nested(compound, hierarchical) state
    • Define compound state
    • Using send
    • Using verbose styled transition via {compoundStateName}Compound field
    • Multi-level (deeply nested) compound state
    • Custom initialization on parent state creation
    • Get a current state of nested state using currentState
      • currentState.of(EnumType) returns the current state of the nested state
    • Reset on parent state enter/exit
    • Reset on parent state reset
  • Support state change history
  • Support any state transition
    • BeatStation with common Beat option
  • Support state.matches as a is{State}
  • Support send() styled transition
    • station.send is supported
  • Support initial context defined in the station annotation
  • Support actions (fire-and-forget)
    • callback action
    • assign action
    • callback action with variable length of arguments
    • choose action
    • forwardTo action
    • log action
    • pure action
    • raise action
    • respond action
    • send action
  • Support invoking services
    • async function (or Future)
    • onDone/onError actions
    • onDone/onError transitions
      • to current station
      • to nested station
    • callback
    • observables
    • other beat station
    • multiple services
  • Support instance options
    • initial state, context
    • dynamically defined actions, services, delays, guards
  • Support eventless(always) transition
  • Support delayed transition
    • Delay on eventless transition
    • Delay on send or $event()
  • Support entry and exit actions
  • Support conditional (guarded) transition
    • Support custom functions
    • Support in state condition
  • Support internal transition
  • Support external transition
  • Support Forbidden transition
  • Support multiple targets
  • Support multiple events
  • Support actors
  • Support state.nextEvents
  • Support state.changed
  • Support state.done
  • Support state.meta, state.tags
  • Support state.can
  • Support history JSON to persist
    • toString() is currently supported
  • Support parallel state
    • Define parallel state
    • Support multiple targets event
  • Separate interpreter and station
    • Support pure transition()
  • Event history with event sourcing
  • Manually execute actions, execute(state) reference
  • waitFor(state, timeout) method reference
  • Support scxml
  • Support bootstrapping
  • Support CLI/GUI tools
  • xstate.js compatible beat station

Additionals for flutter

  • Support beat-station-friendly flutter widgets
  • Inspect state, history, event history, next events, etc., from devtools widget inspector
  • Support remix.run's concept
    • loader
    • action (side effect)
    • ErrorBoundary/CatchBoundary
  • Support navigation

Usage