1. Mixins的作用
iOS中一直都是单继承,假如父类(A)有子类A1、A2、A3。
继承.png
假设A1和A2有共用方法method12;A2和A3有共用方法method23;A1和A3有共用方法method13;这种场景下,单继承还能满足场景吗?
-
方案一:把method12、method23、method13移至父类A中实现
方案一.png
代码复用了,但是父类的方法并不适用所有的子类。例如method12对A3来说就冗余了。
- 方案二:每个子类单独实现需要的方法。
缺点:就是继承的作用完全丢失了。
flutter中提供了一个方案Mixins。mixin去定义并实现相关信息,一个类可以继承多个。
mixin A12 {
void method12() {
print("method12");
}
}
mixin A13 {
void method13() {
print("method13");
}
}
mixin A23 {
void method23() {
print("method23");
}
}
class A {}
class A1 extends A with A12, A13 {}
class A2 extends A with A12, A23 {}
class A3 extends A with A13, A23 {}
method12、method13、method23只用实现一遍,被多个需要的类进行复用。很好的解决了多继承的问题。
2. 系统很多实现采用了这种方式,例如页面间的跳转,在返回到当前页面时,进行刷新操作。
- 定义routeObserver:
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
- 在MaterialApp定义添加观察者:
MaterialApp(navigatorObservers: [routeObserver],);
- 在需要的类withRouteAware:
class _SpaceState extends State<Space> with RouteAware {
@override
void didChangeDependencies() {
super.didChangeDependencies();
routeObserver.subscribe(this, ModalRoute.of(context));
}
@override
void dispose() {
super.dispose();
routeObserver.unsubscribe(this);
}
@override
void didPopNext() {
super.didPopNext();
debugPrint("刷新");
list.loadNewStart();
}
@override
void didPush() {
super.didPush();
}
@override
void didPop() {
super.didPop();
}
@override
void didPushNext() {
super.didPushNext();
}
}
网友评论