Flutter消息订阅与发布插件flutter_pubsub的使用

Flutter消息订阅与发布插件flutter_pubsub的使用

特性

  • 🪶 轻量级实现(少于100行代码)
  • 🚀 零外部依赖
  • 💡 直观的API且无冗余代码
  • ⚡ 高效更新且自动管理订阅
  • 🎯 类型安全的状态管理
  • 📱 Flutter优先设计

安装

在你的项目 pubspec.yaml 文件中添加以下内容:

dependencies:
  pub_sub: ^1.0.0

使用

基本计数器示例
// 定义你的状态
class Counter extends Pub {
  int _count = 0;
  
  int get count => get(_count);
  
  void increment() {
    _count++;
    notifyListeners(); // 通知所有订阅者状态已更改
  }
}

// 创建一个实例
final counter = Counter();

// 在UI中使用
class CounterWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Sub(
      (_) => Text('Count: ${counter.count}'), // 订阅状态并重新构建
    );
  }
}
多个订阅者

多个小部件可以订阅相同的状态:

Widget build(BuildContext context) {
  return Column(
    children: [
      // 第一个订阅者
      Sub(
        (_) => Text('Count: ${counter.count}'),
      ),
      // 第二个订阅者
      Sub(
        (_) => Text('Is even: ${counter.count.isEven}'),
      ),
    ],
  );
}

这是如何工作的

pub_sub 使用了简单的但功能强大的发布-订阅模式实现:

  1. Pub(发布者)类管理状态并通知订阅者状态变化。
  2. Sub(订阅者)小部件会自动订阅状态变化并在需要时重新构建。
  3. 订阅是自动管理的——无需手动清理。

最佳实践

  • 对于全局状态创建单例实例。
  • 状态更改后调用 notifyListeners()
  • 将状态逻辑保留在 Pub 类中。
  • 使用 Sub 小部件来处理依赖于状态的UI。

与其他解决方案的比较

功能 pub_sub Provider Riverpod GetX
设置复杂度 极低 中等 中等 极低
代码冗余 极低 中等
学习曲线 浅显 中等 陡峭 中等
依赖关系

参与贡献

欢迎贡献!请随时提交Pull请求。对于重大更改,请先打开一个问题讨论你想要进行的更改。

许可证

该项目采用MIT许可证——详情请参阅LICENSE文件。

作者

Paurini Taketakehikuroa Wiringi


示例代码

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

// 使用Pub进行状态管理
class Counter extends Pub {
  int _count = 0;

  // 重要:将状态对象包装在一个`get`方法中。
  int get count => get(_count);

  void increment() {
    _count++;
    notifyListeners(); // 通知所有订阅者状态已更改
  }

  void decrement() {
    _count--;
    notifyListeners(); // 通知所有订阅者状态已更改
  }
}

// 创建一个单例实例
final counter = Counter();

// 主应用
void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'PubSub Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        useMaterial3: true,
      ),
      home: const CounterScreen(),
    );
  }
}

// 计数器屏幕,多个小部件订阅相同的状态
class CounterScreen extends StatelessWidget {
  const CounterScreen({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('PubSub Counter'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 第一个订阅者 - 显示计数
            Sub(
              (_) => Text(
                'Count: ${counter.count}',
                style: Theme.of(context).textTheme.headlineMedium,
              ),
            ),
            const SizedBox(height: 20),
            // 第二个订阅者 - 显示奇偶性
            Sub(
              (_) => Text(
                'Number is ${counter.count.isEven ? "even" : "odd"}',
                style: Theme.of(context).textTheme.titleLarge,
              ),
            ),
            const SizedBox(height: 20),
            // 控制按钮
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                FloatingActionButton(
                  onPressed: counter.decrement,
                  child: const Icon(Icons.remove),
                ),
                const SizedBox(width: 20),
                FloatingActionButton(
                  onPressed: counter.increment,
                  child: const Icon(Icons.add),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter消息订阅与发布插件flutter_pubsub的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter消息订阅与发布插件flutter_pubsub的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_pubsub 是一个用于 Flutter 的消息订阅与发布插件,它允许你在应用程序的不同部分之间传递消息。通过使用 flutter_pubsub,你可以实现跨组件的通信,而无需直接引用或依赖其他组件。

安装

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

dependencies:
  flutter:
    sdk: flutter
  flutter_pubsub: ^1.0.0

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

使用

1. 导入包

在你的 Dart 文件中导入 flutter_pubsub

import 'package:flutter_pubsub/flutter_pubsub.dart';

2. 发布消息

你可以使用 PubSub.publish 方法来发布消息。消息可以是任意类型的数据。

PubSub.publish('my_topic', 'Hello, world!');

3. 订阅消息

你可以使用 PubSub.subscribe 方法来订阅消息。订阅方法会返回一个订阅对象,你可以通过它来取消订阅。

var subscription = PubSub.subscribe('my_topic', (data) {
  print('Received data: $data');
});

4. 取消订阅

当你不再需要接收消息时,可以取消订阅:

subscription.unsubscribe();

示例

下面是一个完整的示例,展示了如何使用 flutter_pubsub 进行消息的发布和订阅:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter PubSub Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  // 发布消息
                  PubSub.publish('my_topic', 'Hello from Button 1!');
                },
                child: Text('Publish Message 1'),
              ),
              ElevatedButton(
                onPressed: () {
                  // 发布消息
                  PubSub.publish('my_topic', 'Hello from Button 2!');
                },
                child: Text('Publish Message 2'),
              ),
              MessageListener(),
            ],
          ),
        ),
      ),
    );
  }
}

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

class _MessageListenerState extends State<MessageListener> {
  String _message = 'No message received yet.';

  [@override](/user/override)
  void initState() {
    super.initState();
    // 订阅消息
    PubSub.subscribe('my_topic', (data) {
      setState(() {
        _message = data;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text(_message);
  }
}
回到顶部