前面我聊过状态管理Provider的使用。
通俗地讲,状态管理就是:当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/widget)中的多个子组件之间共享状态(数据),这个时候我们就可以使用Flutter中的状态管理来管理统一的状态(数据),实现不同组件间直接的传值和数据共享。
一个页面中数据改变了,另一个页面中展示的该数据也相应改变,此时可以使用Provider来实现。
一个页面(组件/widget)中调用另外一个页面(组件/widget)中的方法,可以通过event_bus来实现。
event_bus的使用步骤如下。
1,配置依赖,pub.dev上搜“event_bus”,按照文档配置即可。
2,在services文件夹下新建一个EventBus.dart,并在其中配置全局监听的类。如下:
//EventBus.dart
import 'package:event_bus/event_bus.dart';
//初始化Bus
EventBus eventBus = EventBus();
/**
* 下面是定义全局监听的事件类
* 后面根据需要依次在下面累加
*/
//商品详情中全局监听的事件(点击购物车)
class ProductDetailEvent {
String string;
ProductDetailEvent(this.string);
}
3,在需要广播事件的页面发送广播
//广播
eventBus.fire(ProductDetailEvent("加入购物车传入的参数"));
4,在需要监听广播的地方监听广播(一般是在 initState 中监听)
/**
* 监听广播(只监听ProductDetailEvent广播事件)
* 需要注意的是,如果不写尖括号里面的内容(<ProductDetailEvent>),那么表示监听所有广播
*/
eventBus.on<ProductDetailEvent>().listen((event){
print(event);
_showFilterBottomSheet();
});
5,取消事件监听
先定义一个变量用于记录事件监听事件:
var _eventBusOn;//记录事件监听事件,用于取消事件监听
在监听广播的时候(即第4步)记录一下该广播:
/**
* 监听广播(只监听ProductDetailEvent广播事件)
* 需要注意的是,如果不写尖括号里面的内容(<ProductDetailEvent>),那么表示监听所有广播
*/
this._eventBusOn = eventBus.on<ProductDetailEvent>().listen((event){
print(event);
_showFilterBottomSheet();
});
在dispose销毁方法里取消监听:
//销毁
@override
void dispose() {
this._eventBusOn.cancel();//取消事件监听
super.dispose();
}
以上。