Flutter事件广播插件broadcast_events的使用

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

Flutter事件广播插件broadcast_events的使用

broadcast_events 插件允许你在应用中广播事件。以下是如何使用此插件的详细说明及示例代码。

使用

订阅示例

/// 订阅示例
BroadcastEvents().subscribe<String>('CUSTOM_EVENT', (message) {
    print(message);
});

BroadcastEvents()
    .publish<String>('CUSTOM_EVENT', arguments: 'Hello Subscribers');

取消订阅示例

final _handler = (int code) => print('The Code is: $code');

BroadcastEvents().subscribe<int>('CUSTOM_EVENT_2', _handler);

BroadcastEvents().unsubscribe<int>('CUSTOM_EVENT_2', handler: _handler);

BroadcastEvents().publish<int>('CUSTOM_EVENT_2', arguments: 2);

完整示例

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 broadcast_events 插件。

示例代码

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  _incrementHandler(_) {
    this._incrementCounter();
  }

  @override
  void initState() {
    // 添加对 INCREMENT_EVENT 的订阅
    BroadcastEvents().subscribe('INCREMENT_EVENT', _incrementHandler);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('广播事件演示'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '你已经点击按钮多少次了:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.displayMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => {
          // 发布 INCREMENT_EVENT 事件
          BroadcastEvents().publish('INCREMENT_EVENT')
        },
        tooltip: '增加',
        child: Icon(Icons.add),
      ),
    );
  }

  @override
  void dispose() {
    // 从当前部件取消订阅
    BroadcastEvents()
        .unsubscribe('INCREMENT_EVENT', handler: _incrementHandler);

    // 从所有地方取消订阅
    BroadcastEvents().unsubscribe('INCREMENT_EVENT');

    super.dispose();
  }
}

代码解释

  1. 导入库:

    import 'package:broadcast_events/broadcast_events.dart';
    import 'package:flutter/material.dart';
    
  2. 主函数:

    void main() => runApp(MyApp());
    
  3. 创建应用部件:

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData(primarySwatch: Colors.blue),
          home: MyHomePage(),
        );
      }
    }
    
  4. 创建主页状态部件:

    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
  5. 实现主页状态部件:

    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      _incrementHandler(_) {
        this._incrementCounter();
      }
    
      @override
      void initState() {
        // 添加对 INCREMENT_EVENT 的订阅
        BroadcastEvents().subscribe('INCREMENT_EVENT', _incrementHandler);
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('广播事件演示'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  '你已经点击按钮多少次了:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.displayMedium,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () => {
              // 发布 INCREMENT_EVENT 事件
              BroadcastEvents().publish('INCREMENT_EVENT')
            },
            tooltip: '增加',
            child: Icon(Icons.add),
          ),
        );
      }
    
      @override
      void dispose() {
        // 从当前部件取消订阅
        BroadcastEvents()
            .unsubscribe('INCREMENT_EVENT', handler: _incrementHandler);
    
        // 从所有地方取消订阅
        BroadcastEvents().unsubscribe('INCREMENT_EVENT');
    
        super.dispose();
      }
    }
    

更多关于Flutter事件广播插件broadcast_events的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter事件广播插件broadcast_events的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用broadcast_events插件的一个示例。broadcast_events插件允许你在Flutter应用中轻松地进行全局事件广播和监听。

首先,确保你已经在pubspec.yaml文件中添加了broadcast_events依赖:

dependencies:
  flutter:
    sdk: flutter
  broadcast_events: ^x.y.z  # 替换为最新版本号

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

接下来,我们创建一个简单的事件定义和广播、监听这些事件的示例。

1. 定义事件类

首先,我们需要定义一个事件类。这个类可以是任何你想要广播的数据。例如,我们可以定义一个简单的消息事件:

class MessageEvent {
  final String message;

  MessageEvent({required this.message});
}

2. 创建事件总线

在你的应用中创建一个全局的事件总线实例。通常,你可以在应用的主文件中完成这一操作:

import 'package:broadcast_events/broadcast_events.dart';
import 'package:flutter/material.dart';
import 'message_event.dart';  // 导入上面定义的事件类

void main() {
  // 创建事件总线实例
  final EventBus eventBus = EventBus();

  runApp(MyApp(eventBus: eventBus));
}

class MyApp extends StatelessWidget {
  final EventBus eventBus;

  MyApp({required this.eventBus});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(eventBus: eventBus),
    );
  }
}

3. 广播事件

在需要广播事件的地方,使用事件总线的fire方法。例如,在按钮点击时广播一个消息事件:

import 'package:flutter/material.dart';
import 'package:broadcast_events/broadcast_events.dart';
import 'message_event.dart';

class MyHomePage extends StatelessWidget {
  final EventBus eventBus;

  MyHomePage({required this.eventBus});

  void _sendMessage() {
    // 创建并广播事件
    final MessageEvent event = MessageEvent(message: "Hello, World!");
    eventBus.fire(event);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Broadcast Events Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _sendMessage,
          child: Text('Send Message'),
        ),
      ),
    );
  }
}

4. 监听事件

在需要监听事件的地方,使用事件总线的on方法。例如,在另一个页面中监听消息事件:

import 'package:flutter/material.dart';
import 'package:broadcast_events/broadcast_events.dart';
import 'message_event.dart';

class ListenerPage extends StatefulWidget {
  final EventBus eventBus;

  ListenerPage({required this.eventBus});

  @override
  _ListenerPageState createState() => _ListenerPageState();
}

class _ListenerPageState extends State<ListenerPage> {
  @override
  void initState() {
    super.initState();
    // 监听消息事件
    widget.eventBus.on<MessageEvent>().listen((event) {
      // 处理接收到的事件
      print("Received message: ${event.message}");
      // 例如,更新UI
      setState(() {
        // UI更新逻辑
      });
    });
  }

  @override
  void dispose() {
    // 取消监听
    widget.eventBus.off<MessageEvent>();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Listener Page'),
      ),
      body: Center(
        child: Text('Listening for messages...'),
      ),
    );
  }
}

5. 导航到监听页面

最后,确保你的应用可以导航到监听事件的页面。例如,在MyHomePage中添加一个导航按钮:

class MyHomePage extends StatelessWidget {
  final EventBus eventBus;

  MyHomePage({required this.eventBus});

  void _sendMessage() {
    final MessageEvent event = MessageEvent(message: "Hello, World!");
    eventBus.fire(event);
  }

  void _navigateToListenerPage() {
    Navigator.of(context).push(
      MaterialPageRoute(builder: (context) => ListenerPage(eventBus: eventBus)),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Broadcast Events Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _sendMessage,
              child: Text('Send Message'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _navigateToListenerPage,
              child: Text('Go to Listener Page'),
            ),
          ],
        ),
      ),
    );
  }
}

现在,当你点击“Send Message”按钮时,消息事件将被广播。然后,当你导航到监听页面并点击返回按钮回到主页再次点击“Send Message”时,监听页面将打印出接收到的消息。

这就是如何在Flutter项目中使用broadcast_events插件进行事件广播和监听的一个基本示例。

回到顶部