Flutter状态管理插件mobx_triple的使用

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

Flutter状态管理插件mobx_triple的使用

Implementation of the Segmented State Pattern, nicknamed Triple.

文档

Link to doc

特性和问题

The Segmented State Standard is constantly growing.
让我们知道你对这一切的看法。
如果你同意,请给那个代表你签署并同意提议标准的存储库点赞。

问题和建议

issues 频道开放用于提问,报告问题和提出建议,请随时使用此沟通渠道。

让我们一起成为参考


示例代码

示例代码:example/lib/main.dart

// ignore_for_file: invalid_use_of_protected_member

import 'package:flutter/material.dart';
import 'package:mobx_triple/mobx_triple.dart'; // 导入mobx_triple库

import 'counter.dart'; // 导入Counter逻辑文件

void main() {
  runApp(MyApp()); // 启动应用程序
}

class MyApp extends StatelessWidget {
  // 这个小部件是你的应用的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo', // 应用名称
      debugShowCheckedModeBanner: false, // 禁用调试标志
      theme: ThemeData( // 主题设置
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(
        title: 'Flutter Demo Home Page', // 主页标题
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key); // 初始化页面
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState(); // 创建状态类
}

class _MyHomePageState extends State<MyHomePage> {
  final counter = Counter(); // 初始化Counter逻辑实例

  // 浮动按钮的状态控制函数
  Widget _floatingButton(bool active) {
    return FloatingActionButton(
      onPressed: active ? counter.increment : null, // 如果活跃则执行increment
      tooltip: active ? 'Increment' : 'no-active', // 提示信息
      backgroundColor: active ? Theme.of(context).primaryColor : Colors.grey, // 按钮颜色
      child: Icon(Icons.add), // 图标
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title), // 标题
        actions: [
          IconButton(
            onPressed: counter.undo, // 撤销操作
            icon: Icon(Icons.arrow_back_ios), // 左箭头图标
          ),
          IconButton(
            onPressed: counter.redo, // 重做操作
            icon: Icon(Icons.arrow_forward_ios), // 右箭头图标
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center, // 垂直居中
          children: <Widget>[
            // 加载状态显示
            ScopedBuilder(
              store: counter,
              onLoading: (_) {
                return Text(
                  !counter.isLoading ? 'You have pushed the button this many times:' : 'Carregando...', // 根据加载状态显示文本
                );
              },
            ),
            // 显示当前计数器值
            ScopedBuilder(
              store: counter,
              onState: (_, int state) {
                return Text(
                  '$state', // 当前计数值
                  style: Theme.of(context).textTheme.headlineMedium,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: ScopedBuilder(
        store: counter,
        onError: (_, error) => _floatingButton(error == null), // 错误状态处理
        onLoading: (_) => _floatingButton(!counter.isLoading), // 加载状态处理
        onState: (_, __) => _floatingButton(true), // 正常状态处理
      ),
    );
  }
}

示例代码:counter.dart

import 'package:mobx/mobx.dart';
import 'package:mobx_triple/mobx_triple.dart';

part 'counter.g.dart';

class Counter with Store, TripleMixin<int> {
  [@observable](/user/observable)
  int _value = 0;

  [@action](/user/action)
  void increment() {
    if (!_value.isMax()) {
      _value++;
      setState(_value); // 更新状态
    }
  }

  [@action](/user/action)
  void undo() {
    if (_value > 0) {
      _value--;
      setState(_value); // 回退状态
    }
  }

  [@action](/user/action)
  void redo() {
    if (!_value.isMax()) {
      _value++;
      setState(_value); // 前进状态
    }
  }

  bool get isLoading => _value.isMax(); // 判断是否达到最大值
}

extension MaxValue on int {
  bool get isMax => this >= 10; // 自定义扩展方法判断是否达到最大值
}

更多关于Flutter状态管理插件mobx_triple的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter状态管理插件mobx_triple的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


mobx_triple 是一个基于 MobX 的状态管理插件,它结合了 Triple Pattern(Triple 模式)的思想,提供了一种更简单、更直观的方式来管理 Flutter 应用中的状态。Triple Pattern 是一种状态管理模式,它将状态分为三个部分:State(状态)、Error(错误)和 Loading(加载中)。

安装 mobx_triple

首先,你需要在 pubspec.yaml 文件中添加 mobx_triple 依赖:

dependencies:
  flutter:
    sdk: flutter
  mobx_triple: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本使用

mobx_triple 的核心是 Triple 类,它包含了 StateErrorLoading 三个部分。你可以通过继承 Triple 类来创建自己的状态管理类。

1. 创建状态管理类

import 'package:mobx_triple/mobx_triple.dart';

class CounterTriple extends Triple<int, String> {
  CounterTriple() : super(0);

  void increment() {
    update(state + 1);
  }

  void decrement() {
    update(state - 1);
  }
}

在这个例子中,CounterTriple 类继承自 Triple<int, String>,其中 int 是状态类型,String 是错误类型。Triple 的构造函数需要传入一个初始状态值。

update 方法用于更新状态,setError 方法用于设置错误,setLoading 方法用于设置加载状态。

2. 在 UI 中使用 Triple

你可以使用 TripleBuilderObserver 来监听状态的变化,并在 UI 中更新。

import 'package:flutter/material.dart';
import 'package:mobx_triple/mobx_triple.dart';

class CounterPage extends StatelessWidget {
  final CounterTriple counterTriple = CounterTriple();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter with MobX Triple'),
      ),
      body: Center(
        child: TripleBuilder(
          triple: counterTriple,
          builder: (context, triple) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('Counter: ${triple.state}'),
                if (triple.isLoading) CircularProgressIndicator(),
                if (triple.error != null) Text('Error: ${triple.error}'),
              ],
            );
          },
        ),
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: counterTriple.increment,
            child: Icon(Icons.add),
          ),
          SizedBox(height: 10),
          FloatingActionButton(
            onPressed: counterTriple.decrement,
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

在这个例子中,TripleBuilder 用于监听 CounterTriple 的状态变化,并在 UI 中显示当前的状态、加载状态和错误信息。

处理异步操作

mobx_triple 也支持处理异步操作。你可以使用 execute 方法来执行异步操作,并自动处理加载状态和错误状态。

class CounterTriple extends Triple<int, String> {
  CounterTriple() : super(0);

  Future<void> incrementAsync() async {
    execute(() async {
      await Future.delayed(Duration(seconds: 1));
      update(state + 1);
    });
  }
}

在 UI 中,你可以像之前一样使用 TripleBuilder 来监听状态变化。

FloatingActionButton(
  onPressed: counterTriple.incrementAsync,
  child: Icon(Icons.add),
),
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!