这一节主要介绍Flutter中全局事件广播EventBus的用法,相比通知组件,全局事件广播的作用域更大一些,比如在更换界面主题,切换语言等全局性的操作时,体现较为明显。
栗子:
pubspec.yaml
event_bus: ^1.1.0
import 'dart:math';
import 'package:event_bus/event_bus.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
EventBus eventBus;
var themeColor;
final List<Color> themeColorList = [
Colors.red, Colors.orange,Colors.yellow,Colors.green,
Colors.cyan,Colors.blue,Colors.purple];
class EventbusPage extends StatefulWidget {
EventbusPage({Key key}) : super(key: key);
_EventbusPageState createState() => _EventbusPageState();
}
class _EventbusPageState extends State<EventbusPage> {
@override
void initState() {
// TODO: implement initState
super.initState();
eventBus =EventBus();
themeColor = themeColorList[0];
eventBus.on<ChangeThemeEvent>()
.listen((ChangeThemeEvent onData) => setState((){
themeColor = themeColorList[onData.themeIndex];
}));
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "全局事件总线",
theme: ThemeData(
primarySwatch: themeColor,
),
home: Scaffold(
appBar: AppBar(
title: Text("全局事件总线"),
),
body: RaisedButton(
onPressed: () => {
eventBus.fire(ChangeThemeEvent(Random().nextInt(7))),
},
child: Text("点击更换主题色"),
),
),
);
}
}
class ChangeThemeEvent {
var themeIndex;
ChangeThemeEvent(this.themeIndex);
}