Flutter有限状态机管理插件mno_fsm的使用
Flutter有限状态机管理插件mno_fsm的使用
本库用于在Dart中实现有限状态机。灵感来源于Tinder StateMachine 库。
该库是基于https://github.com/ookami-kb/fsm的一个分叉版本。
使用方法
一个简单的使用示例(使用dfunc库生成密封类):
import 'package:dfunc/dfunc.dart';
import 'package:mno_fsm/mno_fsm.dart';
part 'fsm_example.g.dart';
void main() {
final machine = StateMachine<State, Event, SideEffect>.create((g) => g
..initialState(Solid())
..state<Solid>((b) => b
..on<OnMelted>(
(Solid s, OnMelted e) => b.transitionTo(Liquid(), LogMelted())))
..state<Liquid>((b) => b
..onEnter((s) => print('Entering ${s.runtimeType} state'))
..onExit((s) => print('Exiting ${s.runtimeType} state'))
..on<OnFroze>(
(Liquid s, OnFroze e) => b.transitionTo(Solid(), LogFrozen()))
..on<OnVaporized>(
(Liquid s, OnVaporized e) => b.transitionTo(Gas(), LogVaporized())))
..state<Gas>((b) => b
..on<OnCondensed>(
(Gas s, OnCondensed e) => b.transitionTo(Liquid(), LogCondensed())))
..onTransition((t) => t.match(
(v) => print(v.sideEffect),
(_) {},
)));
print(machine.currentState is Solid); // TRUE
machine.transition(OnMelted());
print(machine.currentState is Liquid); // TRUE
machine.transition(OnFroze());
print(machine.currentState is Solid); // TRUE
}
[@sealed](/user/sealed)
abstract class State with _$State {}
class Solid extends State {}
class Liquid extends State {}
class Gas extends State {}
[@sealed](/user/sealed)
abstract class Event with _$Event {}
class OnMelted extends Event {}
class OnFroze extends Event {}
class OnVaporized extends Event {}
class OnCondensed extends Event {}
[@sealed](/user/sealed)
abstract class SideEffect with _$SideEffect {}
class LogMelted extends SideEffect {}
class LogFrozen extends SideEffect {}
class LogVaporized extends SideEffect {}
class LogCondensed extends SideEffect {}
更多关于Flutter有限状态机管理插件mno_fsm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter有限状态机管理插件mno_fsm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用mno_fsm
插件来管理有限状态机(Finite State Machine, FSM)的示例代码。mno_fsm
是一个用于Flutter的状态管理库,它允许你定义状态及其转换逻辑。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加mno_fsm
依赖:
dependencies:
flutter:
sdk: flutter
mno_fsm: ^最新版本号 # 请替换为实际可用的最新版本号
2. 定义状态和事件
接下来,你需要定义你的状态和事件。假设我们有一个简单的登录流程,包含以下状态:
Initial
Loading
LoggedIn
Error
和以下事件:
SubmitCredentials
LoginSuccess
LoginFailure
import 'package:mno_fsm/mno_fsm.dart';
enum LoginState {
Initial,
Loading,
LoggedIn,
Error,
}
enum LoginEvent {
SubmitCredentials,
LoginSuccess,
LoginFailure,
}
3. 定义状态机
然后,你需要定义状态机及其转换逻辑:
import 'package:mno_fsm/mno_fsm.dart';
class LoginFSM extends StateMachine<LoginState, LoginEvent> {
LoginFSM() : super(LoginState.Initial) {
addTransition(
from: LoginState.Initial,
event: LoginEvent.SubmitCredentials,
to: LoginState.Loading,
action: () {
// 触发提交凭证事件时的逻辑,比如开始加载
print("Submitting credentials...");
},
);
addTransition(
from: LoginState.Loading,
event: LoginEvent.LoginSuccess,
to: LoginState.LoggedIn,
action: () {
// 登录成功时的逻辑
print("Login successful!");
},
);
addTransition(
from: LoginState.Loading,
event: LoginEvent.LoginFailure,
to: LoginState.Error,
action: () {
// 登录失败时的逻辑
print("Login failed!");
},
);
}
}
4. 使用状态机
在你的Flutter组件中使用状态机来管理UI状态:
import 'package:flutter/material.dart';
import 'package:mno_fsm/mno_fsm.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: LoginScreen(),
);
}
}
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final LoginFSM _fsm = LoginFSM();
void _submitCredentials() {
// 模拟异步登录操作
Future.delayed(Duration(seconds: 2), () {
// 根据模拟结果触发事件
bool success = true; // 你可以将其改为false来测试错误状态
if (success) {
_fsm.triggerEvent(LoginEvent.LoginSuccess);
} else {
_fsm.triggerEvent(LoginEvent.LoginFailure);
}
});
// 立即触发提交凭证事件
_fsm.triggerEvent(LoginEvent.SubmitCredentials);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Login Screen'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Current State: ${_fsm.currentState.toString().split('.').last}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _submitCredentials,
child: Text('Login'),
),
],
),
),
);
}
}
在这个示例中,LoginScreen
组件使用LoginFSM
来管理其状态。当用户点击“Login”按钮时,_submitCredentials
方法会被调用,该方法首先触发SubmitCredentials
事件,然后在2秒后根据模拟结果触发LoginSuccess
或LoginFailure
事件。
总结
这个示例展示了如何使用mno_fsm
插件在Flutter项目中管理有限状态机。通过定义状态和事件,以及状态机转换逻辑,你可以轻松管理复杂的UI状态。