flutter windows的event_bus 示例

这段Dart代码是使用Flutter框架编写的,它实现了一个简单的应用,其中包含一个主屏幕和一个子窗口,以及一个事件总线来在它们之间传递消息。

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

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

class CustomEvent {
  final String message;

  CustomEvent(this.message);
}

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

class CustomEventBus {
  static EventBus eventBus = EventBus();
}

class MainScreen extends StatefulWidget {
  
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  String _eventMessage = 'No event received';

  
  void initState() {
    super.initState();
    CustomEventBus.eventBus.on<CustomEvent>().listen((event) {
      setState(() {
        _eventMessage = event.message;
      });
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Main Window')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Event from Child Window: $_eventMessage'),
            ChildWindow(),
          ],
        ),
      ),
    );
  }
}

class ChildWindow extends StatefulWidget {
  
  _ChildWindowState createState() => _ChildWindowState();
}

class _ChildWindowState extends State<ChildWindow> {
  String _infoMessage = 'Initial Message';

  
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(16.0),
      margin: EdgeInsets.all(16.0),
      decoration: BoxDecoration(
        color: Colors.blue, // 子窗口背景颜色
        border: Border.all(color: Colors.grey, width: 2.0),
        borderRadius: BorderRadius.circular(8.0),
      ),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Text(_infoMessage), // 显示信息的文本
          ElevatedButton(
            onPressed: () {
              setState(() {
                _infoMessage = 'Message Changed by Change Button';
              });
            },
            child: Text('Change Message'),
          ),
          ElevatedButton(
            onPressed: () {
              CustomEventBus.eventBus.fire(CustomEvent(_infoMessage));
            },
            child: Text('Send Message'),
          ),
        ],
      ),
    );
  }
}

以下是对这段代码的分析:
一、整体结构
这段 Flutter 代码实现了一个简单的事件通信机制,通过自定义事件类和事件总线(EventBus)在主窗口和子窗口之间传递消息。

二、主要部分分析
CustomEvent类:
定义了一个自定义事件类,包含一个字符串类型的message属性,用于在事件总线中传递消息。

MyApp类:
应用的入口点,创建一个MaterialApp并设置主页面为MainScreen。

CustomEventBus类:
一个静态类,用于创建和访问事件总线EventBus的实例,确保在整个应用中只有一个事件总线。

MainScreen类:
主窗口,是一个StatefulWidget。
在initState方法中,监听CustomEvent类型的事件,当接收到事件时,通过setState更新_eventMessage状态变量,从而触发界面的重新构建。
在build方法中,构建了一个Scaffold,包含一个AppBar和一个居中的Column布局,显示从子窗口接收到的事件消息和子窗口ChildWindow。

ChildWindow类:
子窗口,也是一个StatefulWidget。
包含一个状态变量_infoMessage,用于显示子窗口的信息文本。
在build方法中,构建了一个带有特定边距、装饰和颜色的容器,内部包含一个显示信息的文本和两个按钮。
第一个按钮用于更改_infoMessage的值,第二个按钮用于触发事件总线,将当前的_infoMessage作为事件发送出去。

三、事件通信机制
这里使用了event_bus包来实现事件总线机制。主窗口在initState中注册了对CustomEvent类型事件的监听,当子窗口通过CustomEventBus.eventBus.fire(CustomEvent(_infoMessage))触发事件时,主窗口会接收到事件并更新界面显示。

四、总结
这段代码展示了在 Flutter 中如何使用事件总线实现不同组件之间的通信,使得主窗口和子窗口可以独立地管理自己的状态,同时又能够通过事件进行消息传递和交互。这种方式可以提高代码的可维护性和组件的独立性,适用于需要在多个组件之间进行复杂通信的应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值