Flutter状态管理辅助插件state_buddy_flutter的使用

state_buddy_flutter 是一个用于简化 Flutter 状态管理的插件。它通过 Manager 类帮助开发者轻松管理应用的状态,并且提供了灵活的中间件(middleware)功能来处理复杂的业务逻辑。本文将详细介绍如何使用 state_buddy_flutter 来实现状态管理。


核心概念:Manager

state_buddy_flutter 的核心概念围绕 Manager 展开。Manager 可以帮助你管理应用程序的状态,适用于 Flutter 应用和非 Flutter 应用场景。在 Flutter 中,还有一些小部件可以帮助集成 Manager 到你的应用中。

创建 Manager

要创建一个 Manager,你需要继承 Manager 类并指定状态类型。

// 创建一个管理计数器的 Manager,状态类型为 int
class CounterManager extends Manager<int> {
  // 初始化计数器的状态为 0
  CounterManager() : super(0);

  /// 增加计数器
  void increment() {
    emit(state + 1); // 调用 emit 方法更新状态
  }
}
  • emit 方法会更新状态并通知所有监听该状态的组件。
  • state 是当前的管理状态。

监听状态变化

为了让其他部分的程序知道 Manager 的状态发生了变化,我们可以添加监听器。

final counterManager = CounterManager();
final listener = (state) => print(state);

// 添加监听器
counterManager.addListener(listener);

// 移除监听器
counterManager.removeListener(listener);
  • 每当状态发生变化时,监听器函数会被执行。
  • 监听器可以通过 addListenerremoveListener 进行注册和移除。

中间件(Middleware)

如果你希望在状态被分发到监听器之前对其进行修改或读取,可以添加中间件。

同步中间件

final middleware = Middleware<int>((state) {
  print(state); // 打印当前状态
  return state; // 返回状态
});

异步中间件

例如,你可以将状态记录到数据库中:

Middleware<State>((state) async {
  await database.log(state); // 异步操作,例如写入数据库
  return state;
});

链式中间件

你可以将多个中间件组合成一个管道(pipeline),依次执行。

final pipeline = Middleware<int>((state) {
  print(state); // 读取状态
  return state;
})
  ..chain(Middleware((state) {
    return state ~/ 2; // 修改状态
  }))
  ..chain(Middleware((state) async {
    await Future.delayed(Duration(seconds: 1)); // 延迟一秒
    return state;
  }));

final manager = MyManager(baseState);
manager.addMiddleware(pipeline);

Manager 表(ManagerTable)

在大型应用中,ManagerTable 是一个中央存储区域,用于在整个应用中存储和查找 Manager 实例。

// 创建一个 ManagerTable
final managerTable = ManagerTable();

// 创建 Manager 实例
final myManager = MyManager();

// 将 Manager 添加到表中
managerTable.addManager(myManager);

// 通过类型获取 Manager 实例
final myManagerInstance = managerTable.find<MyManager>();

虽然不是严格必要,但推荐使用 ManagerTable,因为它确保每个 Manager 在整个应用中只有一个实例。


在 Flutter 中使用 Manager

在 Flutter 应用中,有一些小部件可以帮助你集成 Manager

Manager Provider

ManagerProvider 是一个内部使用 ManagerTable 的小部件,它可以将 ManagerTable 提供给整个 widget 树中的其他小部件。

void main(List<String> args) {
  // 创建 ManagerTable 并添加 CounterManager
  final managerTable = ManagerTable()..addManager(CounterManager());

  // 包裹应用以提供 ManagerTable 给 widget 树
  runApp(
    ManagerProvider(
      managerTable: managerTable,
      child: const CounterApp(),
    ),
  );
}

ManagerProvider 中获取 Manager

ManagerProvider.of<CounterManager>(context).increment();

ManagerBuilder

ManagerBuilder 用于监听 Manager 的状态变化并在状态改变时重新构建。

class HelloManager extends Manager<String> {
  HelloManager() : super('Hello World');
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    final managerTable = ManagerTable()..addManager(HelloManager());

    return ManagerProvider(
      managerTable: managerTable,
      child: ManagerBuilder<HelloManager, String>(
        builder: (context, state) => Text(state), // 当状态变化时重新构建
      ),
    );
  }
}

完整示例:计数器应用

以下是一个完整的计数器应用示例:

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

// 创建计数器 Manager
class CounterManager extends Manager<int> {
  CounterManager() : super(0);

  /// 增加计数器
  void increment() {
    emit(state + 1); // 更新状态
  }
}

void main(List<String> args) {
  // 创建 ManagerTable 并添加 CounterManager
  final managerTable = ManagerTable()..addManager(CounterManager());

  // 包裹应用以提供 ManagerTable 给 widget 树
  runApp(
    ManagerProvider(
      managerTable: managerTable,
      child: const CounterApp(),
    ),
  );
}

class CounterApp extends StatelessWidget {
  const CounterApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Counter App',
      home: CounterPage(),
    );
  }
}

class CounterPage extends StatelessWidget {
  const CounterPage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        // 使用 ManagerBuilder 监听计数器状态变化
        child: ManagerBuilder<CounterManager, int>(
          builder: (context, state) => Text(state.toString()),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 调用 Manager 的 increment 方法
          ManagerProvider.of<CounterManager>(context).increment();
        },
        child: const Icon(Icons.add),
      ),
    );
  }
}
1 回复

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


state_buddy_flutter 是一个用于 Flutter 应用的状态管理辅助插件。它旨在简化状态管理,提供一种更直观和易用的方式来管理应用的状态。以下是如何使用 state_buddy_flutter 的基本指南。

1. 安装插件

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

dependencies:
  flutter:
    sdk: flutter
  state_buddy_flutter: ^1.0.0  # 请确保使用最新版本

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

2. 创建状态管理类

state_buddy_flutter 提供了一个 StateBuddy 类,你可以继承它来创建自己的状态管理类。

import 'package:state_buddy_flutter/state_buddy_flutter.dart';

class CounterState extends StateBuddy {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners(); // 通知监听者状态已更新
  }

  void decrement() {
    _count--;
    notifyListeners(); // 通知监听者状态已更新
  }
}

3. 在 UI 中使用状态管理类

你可以在 Flutter 的 StatefulWidgetStatelessWidget 中使用 StateBuddy 来管理状态。

使用 StatefulWidget

import 'package:flutter/material.dart';
import 'counter_state.dart'; // 导入刚才创建的 CounterState 类

class CounterApp extends StatefulWidget {
  [@override](/user/override)
  _CounterAppState createState() => _CounterAppState();
}

class _CounterAppState extends State<CounterApp> {
  final CounterState _counterState = CounterState();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('You have pushed the button this many times:'),
              StateBuddyBuilder(
                stateBuddy: _counterState,
                builder: (context, state) {
                  return Text(
                    '${_counterState.count}',
                    style: Theme.of(context).textTheme.headline4,
                  );
                },
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _counterState.increment,
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

使用 StatelessWidget

import 'package:flutter/material.dart';
import 'counter_state.dart'; // 导入刚才创建的 CounterState 类

class CounterApp extends StatelessWidget {
  final CounterState _counterState = CounterState();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('You have pushed the button this many times:'),
              StateBuddyBuilder(
                stateBuddy: _counterState,
                builder: (context, state) {
                  return Text(
                    '${_counterState.count}',
                    style: Theme.of(context).textTheme.headline4,
                  );
                },
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _counterState.increment,
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

4. StateBuddyBuilder 的使用

StateBuddyBuilder 是一个用于监听 StateBuddy 状态变化的 Widget。当 StateBuddy 的状态发生变化时,StateBuddyBuilder 会自动重建其子 Widget。

StateBuddyBuilder(
  stateBuddy: _counterState,
  builder: (context, state) {
    return Text(
      '${_counterState.count}',
      style: Theme.of(context).textTheme.headline4,
    );
  },
)

5. 通知状态变化

StateBuddy 子类中,你可以通过调用 notifyListeners() 来通知所有监听者状态已更新。

void increment() {
  _count++;
  notifyListeners(); // 通知监听者状态已更新
}

6. 其他功能

state_buddy_flutter 还提供了其他一些功能,例如:

  • StateBuddyProvider: 用于在 Widget 树中提供 StateBuddy 实例。
  • StateBuddyConsumer: 用于在 Widget 树中消费 StateBuddy 实例。

7. 示例

以下是一个完整的示例,展示了如何使用 state_buddy_flutter 来管理一个简单的计数器应用。

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

class CounterState extends StateBuddy {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  void decrement() {
    _count--;
    notifyListeners();
  }
}

class CounterApp extends StatelessWidget {
  final CounterState _counterState = CounterState();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('You have pushed the button this many times:'),
              StateBuddyBuilder(
                stateBuddy: _counterState,
                builder: (context, state) {
                  return Text(
                    '${_counterState.count}',
                    style: Theme.of(context).textTheme.headline4,
                  );
                },
              ),
            ],
          ),
        ),
        floatingActionButton: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            FloatingActionButton(
              onPressed: _counterState.increment,
              tooltip: 'Increment',
              child: Icon(Icons.add),
            ),
            SizedBox(height: 10),
            FloatingActionButton(
              onPressed: _counterState.decrement,
              tooltip: 'Decrement',
              child: Icon(Icons.remove),
            ),
          ],
        ),
      ),
    );
  }
}

void main() {
  runApp(CounterApp());
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!