Flutter总线通信插件flutter_easybus的使用

Flutter总线通信插件flutter_easybus的使用

flutter_easybus

flutter_easybus 是一个用于 Flutter 的订阅通信总线插件。

Getting Started

该项目是一个 Dart 包的起点,作为库模块,可以轻松地在多个 Flutter 或 Dart 项目中共享代码。

有关如何开始使用 Flutter 的更多信息,请参阅我们的在线文档,其中包含教程、示例、移动开发指南以及完整的 API 参考。

基础使用

定义任意订阅对象

class BusTest{  
  late Map bus;  
  BusTest({required this.bus});  
}

注册订阅

第一种(推荐)
EventSubscription subscription = EasyBus().on<BusTest>().listen((arg) {  
  print("normal listen ${arg.bus}" );  
});  
// subscription.free(); /// 在合适的位置释放,防止内存泄露
第二种
/// 注意使用 wait 方法订阅,在第一次回调后会自动销毁
var busTest = await EasyBus().on<BusTest>().wait();  
print("wait listen ${busTest.bus}");

发送信息

EasyBus().send(BusTest(bus: {'name': 'easyBus'}));

注销所有当前对象订阅

EasyBus().free<BusTest>();

更简单的使用方法

EasyBus().simpleOn().listen((arg) { /// 直接使用内置对象
  print("simple listen ${arg.key}" );  
});

/// 发送信息
EasyBus().simpleSend("key123", {'name': 'lisa'});

完整示例 Demo

以下是一个完整的示例,展示如何使用 flutter_easybus 插件进行消息传递。

1. 创建订阅者

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SubscriberPage(),
    );
  }
}

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

class _SubscriberPageState extends State<SubscriberPage> {
  String _message = "Waiting for message...";

  [@override](/user/override)
  void initState() {
    super.initState();

    // 使用推荐方式订阅消息
    EventSubscription subscription = EasyBus().on<Map<String, dynamic>>().listen((arg) {
      setState(() {
        _message = arg.toString();
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Subscriber"),
      ),
      body: Center(
        child: Text(_message),
      ),
    );
  }
}

2. 创建发布者

class PublisherPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Publisher"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 发送消息
            EasyBus().send({"key": "value"});
          },
          child: Text("Send Message"),
        ),
      ),
    );
  }
}

3. 主页面路由

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        appBar: TabBar(
          tabs: [
            Tab(text: "Subscriber"),
            Tab(text: "Publisher"),
          ],
        ),
        body: TabBarView(
          children: [
            SubscriberPage(),
            PublisherPage(),
          ],
        ),
      ),
    );
  }
}
1 回复

更多关于Flutter总线通信插件flutter_easybus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_easybus 是一个用于在 Flutter 应用中实现事件总线通信的插件。它允许你在不同的组件、页面或模块之间进行松耦合的通信,而不需要直接引用或依赖彼此。以下是如何使用 flutter_easybus 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_easybus: ^1.0.0  # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 flutter_easybus

import 'package:flutter_easybus/flutter_easybus.dart';

3. 发送事件

你可以使用 EasyBus 来发送事件。事件可以是任何类型的对象。

EasyBus.instance.post("my_event", data: "Hello, EasyBus!");

4. 订阅事件

你可以订阅特定类型的事件,并在事件发生时执行回调函数。

EasyBus.instance.on<String>("my_event").listen((data) {
  print("Received event: $data");
});

5. 取消订阅

为了避免内存泄漏,你需要在不再需要监听事件时取消订阅。通常,你可以在 dispose 方法中取消订阅。

var subscription = EasyBus.instance.on<String>("my_event").listen((data) {
  print("Received event: $data");
});

[@override](/user/override)
void dispose() {
  subscription.cancel();
  super.dispose();
}

6. 使用示例

以下是一个完整的示例,展示了如何在两个不同的页面之间使用 flutter_easybus 进行通信。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FirstPage(),
    );
  }
}

class FirstPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("First Page")),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            EasyBus.instance.post("my_event", data: "Hello from First Page!");
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => SecondPage()),
            );
          },
          child: Text("Go to Second Page"),
        ),
      ),
    );
  }
}

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

class _SecondPageState extends State<SecondPage> {
  String _message = "";

  [@override](/user/override)
  void initState() {
    super.initState();
    EasyBus.instance.on<String>("my_event").listen((data) {
      setState(() {
        _message = data;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Second Page")),
      body: Center(
        child: Text(_message),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!