flutter_bloc - 挂接到特定 cubit 的 onClose、onCreate 生命周期事件
flutter_bloc - hook into onClose, onCreate lifecycle events for specific cubit
我想钩入我肘部的生命周期事件。
我注意到 blocObserver 有 onClose
和 onCreate
,但这是为了观察所有 cubit 的生命周期事件。我如何仅针对特定腕尺连接到这些事件?例如,相当于在一肘内覆盖 onClose
。
我对 ChessMax 答案的实现:
class VpCubit<T> extends Cubit<T> {
VpCubit(T initial) : super(initial);
void onClose() => print('');
@override
Future<void> close() async {
if (onClose != null) {
onClose();
}
return super.close();
}
}
class LoggedOutNickNameCubit extends VpCubit<int> {
LoggedOutNickNameCubit()
: super(0);
@override
void onClose() {
print('closing');
}
void onCreate() {
print('creating');
}
}
一种可能的解决方案是过滤掉观察挂钩中的事件。 BlocObserver 的每个事件都有一个对发送事件的 cubit/bloc 实例的引用。因此,您可以将其与您的特定 cubit/bloc 实例的参考进行比较。如果引用相等,您可以以某种方式处理它。像这样:
class MyObserver extends BlocObserver {
final Cubit<Object> _cubit;
MyObserver(this._cubit) : assert(_cubit != null);
@override
void onClose(Cubit cubit) {
if (cubit == _cubit) {
// do whatever you need
}
super.onClose(cubit);
}
}
另一种方法是创建您自己的 cubit/bloc 子class。覆盖你想听的方法。并使用你自己的 BlocObserver,比如 class 来通知这个特定的 cubit/bloc 听众。像这样:
class MyObserver {
final void Function() onClose;
MyObserver(this.onClose);
}
class MyBloc extends Bloc<MyEvent, MyState> {
final MyObserver _observer;
MyBloc(this._observer) : super(MyInitial());
@override
Future<void> close() async {
if (_observer != null && _observer.onClose != null) {
_observer.onClose();
}
return super.close();
}
}
此外,我认为可以像上面那样编写一个通用的 cubit/bloc 包装基础 class。然后将它用作所有 cubits/blocs class 的基础 class。
我想钩入我肘部的生命周期事件。
我注意到 blocObserver 有 onClose
和 onCreate
,但这是为了观察所有 cubit 的生命周期事件。我如何仅针对特定腕尺连接到这些事件?例如,相当于在一肘内覆盖 onClose
。
我对 ChessMax 答案的实现:
class VpCubit<T> extends Cubit<T> {
VpCubit(T initial) : super(initial);
void onClose() => print('');
@override
Future<void> close() async {
if (onClose != null) {
onClose();
}
return super.close();
}
}
class LoggedOutNickNameCubit extends VpCubit<int> {
LoggedOutNickNameCubit()
: super(0);
@override
void onClose() {
print('closing');
}
void onCreate() {
print('creating');
}
}
一种可能的解决方案是过滤掉观察挂钩中的事件。 BlocObserver 的每个事件都有一个对发送事件的 cubit/bloc 实例的引用。因此,您可以将其与您的特定 cubit/bloc 实例的参考进行比较。如果引用相等,您可以以某种方式处理它。像这样:
class MyObserver extends BlocObserver {
final Cubit<Object> _cubit;
MyObserver(this._cubit) : assert(_cubit != null);
@override
void onClose(Cubit cubit) {
if (cubit == _cubit) {
// do whatever you need
}
super.onClose(cubit);
}
}
另一种方法是创建您自己的 cubit/bloc 子class。覆盖你想听的方法。并使用你自己的 BlocObserver,比如 class 来通知这个特定的 cubit/bloc 听众。像这样:
class MyObserver {
final void Function() onClose;
MyObserver(this.onClose);
}
class MyBloc extends Bloc<MyEvent, MyState> {
final MyObserver _observer;
MyBloc(this._observer) : super(MyInitial());
@override
Future<void> close() async {
if (_observer != null && _observer.onClose != null) {
_observer.onClose();
}
return super.close();
}
}
此外,我认为可以像上面那样编写一个通用的 cubit/bloc 包装基础 class。然后将它用作所有 cubits/blocs class 的基础 class。