Flutter UML2 状态图核心设计插件fsm2的使用

Flutter UML2 状态图核心设计插件fsm2的使用

概述

fsm2 是一个实现了 UML2 状态图核心设计方面的库。它支持以下功能:

  • 嵌套状态(Nested States)
  • 并发区域(Concurrent Regions)
  • 守护条件(Guard Conditions)
  • 副作用(sideEffects)
  • 进入/退出事件处理(onEnter/onExit)
  • 流(streams)
  • 静态分析工具
  • 可视化工具

fsm2 使用构建器模式来声明每个状态机。您的应用程序可以根据需要声明多个状态机。

示例

示例 1:简单的状态机

import 'package:fsm2/fsm2.dart';

void main() {
  final machine = StateMachine.create((g) => g
    ..initialState(Solid())
    ..state<Solid>((b) => b
      ..on<OnMelted, Liquid>(sideEffect: (e) async => print("I'm melting"))
    ..state<Liquid>((b) {})
  );

  // 触发事件
  machine.applyEvent(OnMelted());
}

上述示例创建了一个有限状态机(machine),其初始状态为 Solid,并声明了一个在触发 OnMelted 事件时从 Solid 状态转换到 Liquid 状态的转换。

示例 2:H2O 的生命周期

import 'package:fsm2/fsm2.dart';

void main() async {
  final machine = StateMachine.create((g) => g
    ..initialState<Solid>()
    ..state<Solid>((b) => b
      ..on<OnMelted, Liquid>(sideEffect: (e) => print('Melted'))
      ..onEnter((s, e) => print('Entering ${s.runtimeType} State'))
      ..onExit((s, e) => print('Exiting ${s.runtimeType} State')))
    ..state<Liquid>((b) => b
      ..onEnter((s, e) => print('Entering ${s.runtimeType} State'))
      ..onExit((s, e) => print('Exiting ${s.runtimeType} State'))
      ..on<OnFroze, Solid>(sideEffect: (e) => print('Frozen'))
      ..on<OnVaporized, Gas>(sideEffect: (e) => print('Vaporized')))
    ..state<Gas>((b) => b
      ..onEnter((s, e) => print('Entering ${s.runtimeType} State'))
      ..onExit((s, e) => print('Exiting ${s.runtimeType} State'))
      ..on<OnCondensed, Liquid>(sideEffect: (e) => print('Condensed')))
    ..onTransition((t) => print(
        'Received Event ${t.event.runtimeType} in State ${t.fromState.runtimeType} transitioning to State ${t.toState.runtimeType}')));

  await machine.complete;

  print(machine.isInState<Solid>()); // TRUE

  machine.transition(OnMelted());
  print(machine.isInState<Liquid>()); // TRUE

  machine.transition(OnFroze());
  print(machine.isInState<Solid>()); // TRUE
}

示例 3:完整的 H2O 生命周期

import 'dart:developer';
import 'package:fsm2/fsm2.dart';

void main() async {
  final machine = await StateMachine.create((g) => g
    ..initialState<Solid>()
    ..state<Solid>((b) => b
      ..on<OnMelted, Liquid>(sideEffect: (e) async => log('Melted'))
      ..onEnter((s, e) async => log('Entering $s State'))
      ..onExit((s, e) async => log('Exiting $s State')))
    ..state<Liquid>((b) => b
      ..onEnter((s, e) async => log('Entering $s State'))
      ..onExit((s, e) async => log('Exiting $s State'))
      ..on<OnFroze, Solid>(sideEffect: (e) async => log('Frozen'))
      ..on<OnVaporized, Gas>(sideEffect: (e) async => log('Vaporized')))
    ..state<Gas>((b) => b
      ..onEnter((s, e) async => log('Entering $s State'))
      ..onExit((s, e) async => log('Exiting $s State'))
      ..on<OnCondensed, Liquid>(sideEffect: (e) async => log('Condensed')))
    ..onTransition((from, e, to) => log(
        '''Received Event $e in State ${from!.stateType} transitioning to State ${to!.stateType}''')));

  machine
    ..analyse()
    ..export('test/smcat/water.smcat')
    ..applyEvent(OnMelted())
    ..applyEvent(OnFroze());
}

class Solid implements State {}

class Liquid implements State {}

class Gas implements State {}

class OnMelted implements Event {}

class OnFroze implements Event {}

class OnVaporized implements Event {}

class OnCondensed implements Event {}

文档

完整的文档可以在 GitBooks 上找到。

致谢

fsm2 源自于 FSM 库,该库又受到 Tinder StateMachine 库 的启发。

希望这些示例和说明能帮助你更好地理解和使用 fsm2 插件。如果你有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter UML2 状态图核心设计插件fsm2的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部