Flutter有限状态机管理插件mno_fsm的使用

发布于 1周前 作者 sinazl 来自 Flutter

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

1 回复

更多关于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秒后根据模拟结果触发LoginSuccessLoginFailure事件。

总结

这个示例展示了如何使用mno_fsm插件在Flutter项目中管理有限状态机。通过定义状态和事件,以及状态机转换逻辑,你可以轻松管理复杂的UI状态。

回到顶部