flutter中的eventbus其实就是Stream的一种特殊形式,本质上就是Stream,咱们都知道状态树自父节点向多少有子节点遗传数据采用的是InheritedWidget,自下而上冒泡采用的是Notification,那么同级别的Widget之间传递信息采用的就是EventBus,我从来也记不住eventbus的使用的具体格式,每次用的时候我都会去pub上面搜索EventBus,然后根据示例来用,简单来讲分为两步,第一步创建EventBus,第二步是发射Event,第三步监听Event。补充一点就是Event是一个数据类,所有需要发送的数据都放在这个数据类里面就可以了,可以发送任何数据,放开手脚去玩耍吧!
下面这是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:event_bus/event_bus.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
EventBus _eventBus = EventBus();
Widget initWidget = Text('init data');
int count = 0;
@override
void initState() {
// TODO: implement initState
_eventBus.on<SendEvent>().listen((event) {
// All events are of type UserLoggedInEvent (or subtypes of it).
initWidget = event._widget;
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('event'),
),
body: ListView(
children: <Widget>[
Center(
child: RaisedButton(
child: Icon(Icons.add),
onPressed: () {
Widget sendContent = Image.network(
'http://www.ecobentech.com/images/$count.jpg',
);
_eventBus.fire(SendEvent(sendContent));
if (count == 20) {
count = 0;
} else {
count++;
}
setState(() {
});
}),
),
initWidget,
],
),
);
}
}
class SendEvent {
Widget _widget;
SendEvent(this._widget);
}