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