state_machine_animation 1.0.2 copy "state_machine_animation: ^1.0.2" to clipboard
state_machine_animation: ^1.0.2 copied to clipboard

State-machine driven animation controller and evaluation library based on streams.

example/state_machine_animation_example.dart

import 'package:equatable/equatable.dart';
import 'package:flutter/scheduler.dart';
import 'package:rxdart/rxdart.dart';
import 'package:state_machine_animation/state_machine_animation.dart';

void main() {

  final AppTickerManager tickerManager = AppTickerManager();

  final BehaviorSubject<AppState> stateSubject = BehaviorSubject<AppState>.seeded(AppState(Position.center));

  final ExampleAFSM stateMachine = ExampleAFSM(stateSubject, tickerManager);

  final animation = DoubleAnimationProperty<AppState>(
      keyEvaluator: (key, sourceState) {
        if( key == "LEFT" ){
          return -100;
        } else if( key == "CENTER" ){
          return 0;
        } else {
          return -100;
        }
      }
  ).getAnimation(stateMachine.output);

  animation.listen((animationProperty) {
    print("${animationProperty.time}: ${animationProperty.value}");
  });

  stateSubject.add(AppState(Position.left));

}

enum Position {
  left,
  center,
  right;
}

class AppState extends Equatable {

  final Position position;

  const AppState(this.position);

  @override
  List<Object?> get props => [position];

}

class ExampleAFSM extends AnimationStateMachine<AppState> {

  ExampleAFSM(super.input, super.tickerManager);

  @override
  bool isReady(state) => true;

  @override
  AnimationStateMachineConfig<AppState> getConfig(state) => AnimationStateMachineConfig(
      nodes: ["LEFT", "CENTER", "RIGHT"],
      initialState: Idle("CENTER"),
      defaultDuration: 1000
  );

  @override
  void reactToStateChanges(state, previous) {
    transitionTo(Idle(state.position.name.toUpperCase()));
  }

}

class AppTickerManager implements TickerManager {

  final List<Ticker> _tickers = <Ticker>[];

  @override
  Ticker createTicker(TickerCallback onTick) {
    final ticker = Ticker(onTick);
    _tickers.add(ticker);
    return ticker;
  }

  @override
  void disposeTicker(Ticker ticker){
    ticker.dispose();
    _tickers.remove(ticker);
  }

}
1
likes
0
pub points
9%
popularity

Publisher

unverified uploader

State-machine driven animation controller and evaluation library based on streams.

Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

belatuk_merge_map, clock, equatable, flutter, memoized, rxdart

More

Packages that depend on state_machine_animation