Flutter本地事件发布/订阅插件local_pubsub的使用

Flutter本地事件发布/订阅插件local_pubsub的使用

local_pubsub 是一个简单的用于 Dart 的本地发布/订阅库。它允许你订阅不同的主题并发送消息给该主题的所有订阅者。

使用步骤

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 local_pubsub 作为依赖:

dependencies:
  local_pubsub: ^1.0.0

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

2. 初始化 PubSub 实例

创建一个 PubSub 实例来管理订阅和发布。

import 'package:local_pubsub/local_pubsub.dart';

void main() {
  // 创建 PubSub 实例
  PubSub pubsub = PubSub();
}

3. 订阅主题

你可以通过调用 subscribe 方法来订阅某个主题,并返回一个 Subscription 对象。

void main() {
  PubSub pubsub = PubSub();

  // 订阅名为 "topic" 的主题
  Subscription? sub = pubsub.subscribe('topic');

  // 监听消息
  sub?.stream.listen((message) {
    print('收到消息: $message');
  });
}

4. 取消订阅

当你不再需要监听某个主题的消息时,可以调用 unsubscribe 方法取消订阅。

void main() {
  PubSub pubsub = PubSub();

  // 订阅名为 "topic" 的主题
  Subscription? sub = pubsub.subscribe('topic');

  // 取消订阅
  pubsub.unsubscribe(sub);
}

5. 发布消息

你可以通过调用 publish 方法向指定主题发布消息。

void main() {
  PubSub pubsub = PubSub();

  // 订阅名为 "topic" 的主题
  Subscription? sub = pubsub.subscribe('topic');

  // 监听消息
  sub?.stream.listen((message) {
    print('收到消息: $message');
  });

  // 向 "topic" 主题发布消息
  pubsub.publish('topic', 'hello');
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用 local_pubsub 插件进行事件发布和订阅:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final PubSub _pubsub = PubSub();
  late Subscription _subscription;

  @override
  void initState() {
    super.initState();

    // 订阅名为 "greeting" 的主题
    _subscription = _pubsub.subscribe('greeting');

    // 监听消息
    _subscription.stream.listen((message) {
      print('收到消息: $message');
    });
  }

  @override
  void dispose() {
    // 取消订阅
    _pubsub.unsubscribe(_subscription);
    super.dispose();
  }

  void _publishMessage() {
    // 向 "greeting" 主题发布消息
    _pubsub.publish('greeting', 'Hello, World!');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Local PubSub 示例'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _publishMessage,
          child: Text('发布消息'),
        ),
      ),
    );
  }
}

运行效果

当你点击按钮时,会在控制台输出以下内容:

收到消息: Hello, World!

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

1 回复

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


local_pubsub 是一个用于 Flutter 的本地事件发布/订阅插件。它允许你在应用程序的不同部分之间发布和订阅事件,而不需要依赖全局状态管理库(如 Provider、Riverpod 等)。这个插件非常适合在局部范围内进行事件通信。

安装

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

dependencies:
  flutter:
    sdk: flutter
  local_pubsub: ^1.0.0  # 请检查最新版本

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

基本用法

1. 导入包

import 'package:local_pubsub/local_pubsub.dart';

2. 创建 LocalPubSub 实例

你可以在需要的地方创建 LocalPubSub 实例。通常,你可以将它放在一个顶层 widget 中,或者在任何需要的地方创建它。

final localPubSub = LocalPubSub();

3. 订阅事件

你可以使用 subscribe 方法来订阅特定类型的事件。当事件被发布时,订阅者会收到通知。

localPubSub.subscribe<String>((event) {
  print('Received event: $event');
});

4. 发布事件

你可以使用 publish 方法来发布事件。所有订阅了该事件类型的订阅者都会收到通知。

localPubSub.publish<String>('Hello, World!');

5. 取消订阅

如果你不再需要接收某个事件,可以使用 unsubscribe 方法来取消订阅。

final subscription = localPubSub.subscribe<String>((event) {
  print('Received event: $event');
});

// 取消订阅
subscription.cancel();

示例

以下是一个完整的示例,展示了如何在 Flutter 中使用 local_pubsub

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

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

class MyApp extends StatelessWidget {
  final localPubSub = LocalPubSub();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Local PubSub Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () {
                  localPubSub.publish<String>('Button Pressed!');
                },
                child: Text('Publish Event'),
              ),
              SizedBox(height: 20),
              EventListener(localPubSub: localPubSub),
            ],
          ),
        ),
      ),
    );
  }
}

class EventListener extends StatefulWidget {
  final LocalPubSub localPubSub;

  EventListener({required this.localPubSub});

  [@override](/user/override)
  _EventListenerState createState() => _EventListenerState();
}

class _EventListenerState extends State<EventListener> {
  String? eventMessage;

  [@override](/user/override)
  void initState() {
    super.initState();
    widget.localPubSub.subscribe<String>((event) {
      setState(() {
        eventMessage = event;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text('Event: ${eventMessage ?? 'No event received'}');
  }
}
回到顶部