diff --git a/packages/yx_scope/example/bin/app_listener.dart b/packages/yx_scope/example/bin/app_listener.dart new file mode 100644 index 0000000..7a69222 --- /dev/null +++ b/packages/yx_scope/example/bin/app_listener.dart @@ -0,0 +1,111 @@ +import 'package:yx_scope/yx_scope.dart'; +import './main.dart'; + +class AppScopeHolderWithListener extends ScopeHolder { + static const _listener = AppListener(); + + AppScopeHolderWithListener() + // ignore: deprecated_member_use + : super(scopeListeners: [_listener], depListeners: [_listener]); + + @override + AppScopeContainer createContainer() => AppScopeContainer(); +} + +// ignore: deprecated_member_use +class AppListener implements ScopeListener, DepListener, AsyncDepListener { + const AppListener(); + + static void _log( + String message, [ + Object? exception, + StackTrace? stackTrace, + ]) { + print(message); + if (exception != null) { + print(exception); + if (stackTrace != null) { + print(stackTrace); + } + } + } + + @override + void onScopeStartInitialize(ScopeId scope) => + _log('[$scope] -> onScopeStartInitialize'); + + @override + void onScopeInitialized(ScopeId scope) => + _log('[$scope] -> onScopeInitialized'); + + @override + void onScopeInitializeFailed( + ScopeId scope, + Object exception, + StackTrace stackTrace, + ) => + _log('[$scope] -> onScopeInitializeFailed', exception, stackTrace); + + @override + void onScopeStartDispose(ScopeId scope) => + _log('[$scope] -> onScopeStartDispose'); + + @override + void onScopeDisposed(ScopeId scope) => _log('[$scope] -> onScopeDisposed'); + + @override + void onScopeDisposeDepFailed( + ScopeId scope, + DepId dep, + Object exception, + StackTrace stackTrace, + ) => + _log('[$scope] -> onScopeDisposeDepFailed', exception, stackTrace); + + @override + void onValueStartCreate(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onValueStartCreate'); + + @override + void onValueCreated(ScopeId scope, DepId dep, ValueMeta? valueMeta) => + _log('[$scope.$dep] -> onValueCreated'); + + @override + void onValueCreateFailed( + ScopeId scope, + DepId dep, + Object exception, + StackTrace stackTrace, + ) => + _log('[$scope.$dep] -> onValueCreated', exception, stackTrace); + + @override + void onValueCleared(ScopeId scope, DepId dep, ValueMeta? valueMeta) => + _log('[$scope.$dep]($valueMeta) -> onValueCleared'); + + @override + void onDepDisposeFailed( + ScopeId scope, DepId dep, Object exception, StackTrace stackTrace) => + _log('[$scope.$dep] -> onDepDisposeFailed', exception, stackTrace); + + @override + void onDepDisposed(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepDisposed'); + + @override + void onDepInitializeFailed( + ScopeId scope, DepId dep, Object exception, StackTrace stackTrace) => + _log('[$scope.$dep] -> onDepInitializeFailed', exception, stackTrace); + + @override + void onDepInitialized(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepInitialized'); + + @override + void onDepStartDispose(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepStartDispose'); + + @override + void onDepStartInitialize(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepStartInitialize'); +} diff --git a/packages/yx_scope/example/bin/deprecated_listeners_main.dart b/packages/yx_scope/example/bin/deprecated_listeners_main.dart new file mode 100644 index 0000000..495746b --- /dev/null +++ b/packages/yx_scope/example/bin/deprecated_listeners_main.dart @@ -0,0 +1,15 @@ +import 'app_listener.dart'; + +/// This file will be deleted in the next major version +/// when Listeners will be completely removed +void main() async { + final appScopeHolderWithListener = AppScopeHolderWithListener(); + + await appScopeHolderWithListener.create(); + + print(appScopeHolderWithListener.scope?.routerDelegateDep.get); + + await appScopeHolderWithListener.drop(); + + print(appScopeHolderWithListener.scope?.routerDelegateDep.get); +} diff --git a/packages/yx_scope/example/bin/main.dart b/packages/yx_scope/example/bin/main.dart index 9bdb693..05fdd92 100644 --- a/packages/yx_scope/example/bin/main.dart +++ b/packages/yx_scope/example/bin/main.dart @@ -31,17 +31,17 @@ class AppScopeContainer extends ScopeContainer { } class AppScopeHolder extends ScopeHolder { - static const _listener = AppListener(); + static const _observer = AppObserver(); AppScopeHolder() - : super(scopeListeners: [_listener], depListeners: [_listener]); + : super(scopeObservers: [_observer], depObservers: [_observer]); @override AppScopeContainer createContainer() => AppScopeContainer(); } -class AppListener implements ScopeListener, DepListener { - const AppListener(); +class AppObserver implements ScopeObserver, DepObserver, AsyncDepObserver { + const AppObserver(); static void _log( String message, [ @@ -109,4 +109,30 @@ class AppListener implements ScopeListener, DepListener { @override void onValueCleared(ScopeId scope, DepId dep, ValueMeta? valueMeta) => _log('[$scope.$dep]($valueMeta) -> onValueCleared'); + + @override + void onDepDisposeFailed( + ScopeId scope, DepId dep, Object exception, StackTrace stackTrace) => + _log('[$scope.$dep] -> onDepDisposeFailed', exception, stackTrace); + + @override + void onDepDisposed(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepDisposed'); + + @override + void onDepInitializeFailed( + ScopeId scope, DepId dep, Object exception, StackTrace stackTrace) => + _log('[$scope.$dep] -> onDepInitializeFailed', exception, stackTrace); + + @override + void onDepInitialized(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepInitialized'); + + @override + void onDepStartDispose(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepStartDispose'); + + @override + void onDepStartInitialize(ScopeId scope, DepId dep) => + _log('[$scope.$dep] -> onDepStartInitialize'); } diff --git a/packages/yx_scope/lib/advanced.dart b/packages/yx_scope/lib/advanced.dart index 8262674..94969e7 100644 --- a/packages/yx_scope/lib/advanced.dart +++ b/packages/yx_scope/lib/advanced.dart @@ -1 +1 @@ -export 'src/monitoring/raw_listeners.dart'; +export 'src/monitoring/raw_observers.dart'; diff --git a/packages/yx_scope/lib/src/base_scope_container.dart b/packages/yx_scope/lib/src/base_scope_container.dart index 047c0a6..7af4dde 100644 --- a/packages/yx_scope/lib/src/base_scope_container.dart +++ b/packages/yx_scope/lib/src/base_scope_container.dart @@ -6,11 +6,11 @@ import 'package:meta/meta.dart'; import 'core/async_lifecycle.dart'; import 'core/scope_exception.dart'; import 'core/scope_state.dart'; -import 'monitoring/listeners.dart'; +import 'monitoring/observers.dart'; import 'monitoring/models/dep_id.dart'; import 'monitoring/models/scope_id.dart'; import 'monitoring/models/value_meta.dart'; -import 'monitoring/raw_listeners.dart'; +import 'monitoring/raw_observers.dart'; import 'monitoring/scope_observatory_internal.dart'; import 'scope_container.dart'; import 'scope_state_streamable.dart'; @@ -21,7 +21,7 @@ part 'core_scope_holder.dart'; part 'dep.dart'; -part 'monitoring/listeners_internal.dart'; +part 'monitoring/observers_internal.dart'; part 'monitoring/models/scope_meta.dart'; @@ -70,15 +70,15 @@ abstract class BaseScopeContainer extends Scope { final String? _name; late final ScopeId _id; - late final DepListenerInternal _depListener; - late final AsyncDepListenerInternal _asyncDepListener; + late final DepObserverInternal _depObserver; + late final AsyncDepObserverInternal _asyncDepObserver; BaseScopeContainer({String? name}) : _name = name, super._() { _id = ScopeId(runtimeType, hashCode, _name); - _depListener = DepListenerInternal(this); - _asyncDepListener = AsyncDepListenerInternal(this); + _depObserver = DepObserverInternal(this); + _asyncDepObserver = AsyncDepObserverInternal(this); } /// A queue of the initialization for [AsyncDep]. @@ -118,7 +118,7 @@ abstract class BaseScopeContainer extends Scope { DepBuilder builder, { String? name, }) => - Dep._(this, builder, name: name, listener: _depListener); + Dep._(this, builder, name: name, observer: _depObserver); /// Exactly the same as [BaseScopeContainer.dep] but you only allowed /// to declare [AsyncLifecycle] dependencies using this method. @@ -160,7 +160,7 @@ abstract class BaseScopeContainer extends Scope { init: init, dispose: dispose, name: name, - listener: _asyncDepListener, + observer: _asyncDepObserver, ); void _registerDep(Dep dep) => _container.add(dep); diff --git a/packages/yx_scope/lib/src/core_scope_holder.dart b/packages/yx_scope/lib/src/core_scope_holder.dart index a0e69f7..337b26e 100644 --- a/packages/yx_scope/lib/src/core_scope_holder.dart +++ b/packages/yx_scope/lib/src/core_scope_holder.dart @@ -8,9 +8,9 @@ part of 'base_scope_container.dart'; /// This is the core entity that provides access to the [BaseScopeContainer]. abstract class CoreScopeHolder extends ScopeStateHolder with ScopeStateStreamable { - final ScopeListenerInternal _scopeListenerInternal; - final List? _depListeners; - final List? _asyncDepListeners; + final ScopeObserverInternal _scopeObserverInternal; + final List? _depObservers; + final List? _asyncDepObservers; final _scopeStateHolder = ScopeStateHolder(ScopeState.none); Completer? _waitLifecycleCompleter; @@ -18,12 +18,26 @@ abstract class CoreScopeHolder ScopeState get _scopeState => _scopeStateHolder.scope; CoreScopeHolder({ + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, + // ignore: deprecated_member_use_from_same_package + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + // ignore: deprecated_member_use_from_same_package + @Deprecated('Use depObservers instead') List? depListeners, + // ignore: deprecated_member_use_from_same_package + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, - }) : _scopeListenerInternal = ScopeListenerInternal(scopeListeners), - _depListeners = depListeners, - _asyncDepListeners = asyncDepListeners, + }) : assert(!(scopeListeners != null && scopeObservers != null), + 'Both scopeObservers and scopeListeners passed as arguments to ScopeHolder. Consider using only scopeObservers'), + assert(!(depListeners != null && depObservers != null), + 'Both depObservers and depListeners passed as arguments to ScopeHolder. Consider using only depObservers'), + assert(!(asyncDepListeners != null && asyncDepObservers != null), + 'Both asyncDepObservers and asyncDepListeners passed as arguments to ScopeHolder. Consider using only asyncDepObservers'), + _scopeObserverInternal = ScopeObserverInternal(scopeObservers), + _depObservers = depObservers, + _asyncDepObservers = asyncDepObservers, super(null); /// Initialize scope. [Scope] becomes available and everyone can @@ -116,9 +130,9 @@ abstract class CoreScopeHolder break; } - _prepareListeners(scope); + _prepareObservers(scope); - _scopeListenerInternal.onScopeStartInitialize(scope); + _scopeObserverInternal.onScopeStartInitialize(scope); _initializing(); @@ -154,13 +168,13 @@ abstract class CoreScopeHolder ); } } on Object catch (e, s) { - _scopeListenerInternal.onScopeInitializeFailed(scope, e, s); + _scopeObserverInternal.onScopeInitializeFailed(scope, e, s); await _drop(initializedScope: scope, initializedDeps: initialized); rethrow; } _available(scope as Scope); - _scopeListenerInternal.onScopeInitialized(scope); + _scopeObserverInternal.onScopeInitialized(scope); } /// Dispose scope. [Scope] becomes unavailable. @@ -281,7 +295,7 @@ abstract class CoreScopeHolder ); } - _scopeListenerInternal.onScopeStartDispose(scope); + _scopeObserverInternal.onScopeStartDispose(scope); _disposing(); @@ -310,7 +324,7 @@ abstract class CoreScopeHolder e, s, ); - _scopeListenerInternal.onScopeDisposeDepFailed( + _scopeObserverInternal.onScopeDisposeDepFailed( scope, dep, e, @@ -325,9 +339,9 @@ abstract class CoreScopeHolder ); } scope._unregister(); - _clearListeners(scope); + _clearObservers(scope); await _disposed(); - _scopeListenerInternal.onScopeDisposed(scope); + _scopeObserverInternal.onScopeDisposed(scope); } // ignore: use_setters_to_change_properties @@ -358,15 +372,15 @@ abstract class CoreScopeHolder void _disposing() => _updateScope(ScopeState.disposing); - void _prepareListeners(Container scope) { - scope._depListener._listeners = _depListeners; - scope._asyncDepListener._listeners = _asyncDepListeners; - scope._asyncDepListener._asyncDepListeners = _asyncDepListeners; + void _prepareObservers(Container scope) { + scope._depObserver._observers = _depObservers; + scope._asyncDepObserver._observers = _asyncDepObservers; + scope._asyncDepObserver._asyncDepObservers = _asyncDepObservers; } - void _clearListeners(Container scope) { - scope._depListener._listeners = null; - scope._asyncDepListener._listeners = null; - scope._asyncDepListener._asyncDepListeners = null; + void _clearObservers(Container scope) { + scope._depObserver._observers = null; + scope._asyncDepObserver._observers = null; + scope._asyncDepObserver._asyncDepObservers = null; } } diff --git a/packages/yx_scope/lib/src/dep.dart b/packages/yx_scope/lib/src/dep.dart index f56e342..1733f7c 100644 --- a/packages/yx_scope/lib/src/dep.dart +++ b/packages/yx_scope/lib/src/dep.dart @@ -30,7 +30,7 @@ class Dep { final BaseScopeContainer _scope; final DepBuilder _builder; - final DepListenerInternal? _listener; + final DepObserverInternal? _observer; late final DepId _id; @@ -42,9 +42,9 @@ class Dep { this._scope, this._builder, { String? name, - DepListenerInternal? listener, + DepObserverInternal? observer, }) : _name = name, - _listener = listener { + _observer = observer { _id = DepId(Value, hashCode, _name); _scope._registerDep(this); _registered = true; @@ -69,14 +69,14 @@ class Dep { return crtValue.value; } else { try { - _listener?.onValueStartCreate(this); + _observer?.onValueStartCreate(this); final newValue = _builder(); _value = _DepValue(newValue); - _listener?.onValueCreated(this, newValue); + _observer?.onValueCreated(this, newValue); return newValue; } on Object catch (e, s) { - _listener?.onValueCreateFailed(this, e, s); + _observer?.onValueCreateFailed(this, e, s); rethrow; } } @@ -92,7 +92,7 @@ class Dep { } final value = _value?.value; _value = null; - _listener?.onValueCleared(this, value); + _observer?.onValueCleared(this, value); _registered = false; } } @@ -103,7 +103,7 @@ class AsyncDep extends Dep { final AsyncDepCallback _initCallback; final AsyncDepCallback _disposeCallback; - final AsyncDepListenerInternal? _asyncDepListener; + final AsyncDepObserverInternal? _asyncDepObserver; var _initialized = false; @@ -113,21 +113,21 @@ class AsyncDep extends Dep { required AsyncDepCallback init, required AsyncDepCallback dispose, String? name, - AsyncDepListenerInternal? listener, + AsyncDepObserverInternal? observer, }) : _initCallback = init, _disposeCallback = dispose, - _asyncDepListener = listener, - super._(scope, builder, name: name, listener: listener); + _asyncDepObserver = observer, + super._(scope, builder, name: name, observer: observer); Future _init() async { final value = super.get; try { - _asyncDepListener?.onDepStartInitialize(this); + _asyncDepObserver?.onDepStartInitialize(this); await _initCallback(value); _initialized = true; - _asyncDepListener?.onDepInitialized(this); + _asyncDepObserver?.onDepInitialized(this); } on Object catch (e, s) { - _asyncDepListener?.onDepInitializeFailed(this, e, s); + _asyncDepObserver?.onDepInitializeFailed(this, e, s); rethrow; } } @@ -140,11 +140,11 @@ class AsyncDep extends Dep { final value = get; try { _initialized = false; - _asyncDepListener?.onDepStartDispose(this); + _asyncDepObserver?.onDepStartDispose(this); await _disposeCallback(value); - _asyncDepListener?.onDepDisposed(this); + _asyncDepObserver?.onDepDisposed(this); } on Object catch (e, s) { - _asyncDepListener?.onDepDisposeFailed(this, e, s); + _asyncDepObserver?.onDepDisposeFailed(this, e, s); rethrow; } } diff --git a/packages/yx_scope/lib/src/monitoring/listeners.dart b/packages/yx_scope/lib/src/monitoring/listeners.dart index 43d309d..14c0c98 100644 --- a/packages/yx_scope/lib/src/monitoring/listeners.dart +++ b/packages/yx_scope/lib/src/monitoring/listeners.dart @@ -1,75 +1,11 @@ -import 'models/dep_id.dart'; -import 'models/scope_id.dart'; -import 'models/value_meta.dart'; +part of 'observers.dart'; -abstract class ScopeListener { - void onScopeStartInitialize(ScopeId scope); +@Deprecated('Use ScopeObserver instead') +abstract class ScopeListener implements ScopeObserver {} - void onScopeInitialized(ScopeId scope); +@Deprecated('Use DepObserver instead') +abstract class DepListener implements DepObserver {} - void onScopeInitializeFailed( - ScopeId scope, - Object exception, - StackTrace stackTrace, - ); - - void onScopeStartDispose(ScopeId scope); - - void onScopeDisposed(ScopeId scope); - - /// The method is called when dispose of the [dep] has failed - /// during the dispose phase of the [scope]. - /// - /// This method can be called many times during dispose phase. - void onScopeDisposeDepFailed( - ScopeId scope, - DepId dep, - Object exception, - StackTrace stackTrace, - ); - - const ScopeListener._(); -} - -abstract class DepListener { - void onValueStartCreate(ScopeId scope, DepId dep); - - void onValueCreated(ScopeId scope, DepId dep, ValueMeta? valueMeta); - - void onValueCreateFailed( - ScopeId scope, - DepId dep, - Object exception, - StackTrace stackTrace, - ); - - void onValueCleared(ScopeId scope, DepId dep, ValueMeta? valueMeta); - - const DepListener._(); -} - -abstract class AsyncDepListener implements DepListener { - void onDepStartInitialize(ScopeId scope, DepId dep); - - void onDepInitialized(ScopeId scope, DepId dep); - - void onDepStartDispose(ScopeId scope, DepId dep); - - void onDepDisposed(ScopeId scope, DepId dep); - - void onDepInitializeFailed( - ScopeId scope, - DepId dep, - Object exception, - StackTrace stackTrace, - ); - - void onDepDisposeFailed( - ScopeId scope, - DepId dep, - Object exception, - StackTrace stackTrace, - ); - - const AsyncDepListener._(); -} +@Deprecated('Use AsyncDepObserver instead') +abstract class AsyncDepListener extends DepListener + implements AsyncDepObserver {} diff --git a/packages/yx_scope/lib/src/monitoring/observers.dart b/packages/yx_scope/lib/src/monitoring/observers.dart new file mode 100644 index 0000000..5b56248 --- /dev/null +++ b/packages/yx_scope/lib/src/monitoring/observers.dart @@ -0,0 +1,89 @@ +import 'models/dep_id.dart'; +import 'models/scope_id.dart'; +import 'models/value_meta.dart'; + +part 'listeners.dart'; + +/// Interface for observing [Scope] state. +/// +/// To observe [Scope] state create your implementation of this interface +/// and pass it to your [ScopeHolder]. +abstract class ScopeObserver { + void onScopeStartInitialize(ScopeId scope); + + void onScopeInitialized(ScopeId scope); + + void onScopeInitializeFailed( + ScopeId scope, + Object exception, + StackTrace stackTrace, + ); + + void onScopeStartDispose(ScopeId scope); + + void onScopeDisposed(ScopeId scope); + + /// The method is called when dispose of the [dep] has failed + /// during the dispose phase of the [scope]. + /// + /// This method can be called many times during dispose phase. + void onScopeDisposeDepFailed( + ScopeId scope, + DepId dep, + Object exception, + StackTrace stackTrace, + ); + + const ScopeObserver._(); +} + +/// Interface for observing [Dep] state. +/// +/// To observe [Dep] state create your implementation of this interface +/// and pass it to your [ScopeHolder]. +abstract class DepObserver { + void onValueStartCreate(ScopeId scope, DepId dep); + + void onValueCreated(ScopeId scope, DepId dep, ValueMeta? valueMeta); + + void onValueCreateFailed( + ScopeId scope, + DepId dep, + Object exception, + StackTrace stackTrace, + ); + + void onValueCleared(ScopeId scope, DepId dep, ValueMeta? valueMeta); + + const DepObserver._(); +} + +/// Interface for observing [AsyncDep] state. +/// +/// To observe [AsyncDep] state create your implementation of this interface +/// and pass it to your [ScopeHolder]. +abstract class AsyncDepObserver implements DepObserver { + void onDepStartInitialize(ScopeId scope, DepId dep); + + void onDepInitialized(ScopeId scope, DepId dep); + + void onDepStartDispose(ScopeId scope, DepId dep); + + void onDepDisposed(ScopeId scope, DepId dep); + + void onDepInitializeFailed( + ScopeId scope, + DepId dep, + Object exception, + StackTrace stackTrace, + ); + + void onDepDisposeFailed( + ScopeId scope, + DepId dep, + Object exception, + StackTrace stackTrace, + ); + + const AsyncDepObserver._(); +} diff --git a/packages/yx_scope/lib/src/monitoring/listeners_internal.dart b/packages/yx_scope/lib/src/monitoring/observers_internal.dart similarity index 66% rename from packages/yx_scope/lib/src/monitoring/listeners_internal.dart rename to packages/yx_scope/lib/src/monitoring/observers_internal.dart index c9950bc..1487ad4 100644 --- a/packages/yx_scope/lib/src/monitoring/listeners_internal.dart +++ b/packages/yx_scope/lib/src/monitoring/observers_internal.dart @@ -1,28 +1,32 @@ part of '../base_scope_container.dart'; -class ScopeListenerInternal implements RawScopeListener { - final List? _listeners; +/// DO NOT USE THIS CLASS MANUALLY +/// +/// [RawScopeObserver] implementation for [CoreScopeHolder] that notifies +/// [ScopeObserver]s +class ScopeObserverInternal implements RawScopeObserver { + final List? _observers; - const ScopeListenerInternal(this._listeners); + const ScopeObserverInternal(this._observers); @override void onScopeStartInitialize(BaseScopeContainer scope) { - RawScopeListener.override?.safeNotify( + RawScopeObserver.override?.safeNotify( (listener) => listener.onScopeStartInitialize(scope), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onScopeStartInitialize(scope._id), ); } @override void onScopeInitialized(BaseScopeContainer scope) { - RawScopeListener.override?.safeNotify( + RawScopeObserver.override?.safeNotify( (listener) => listener.onScopeInitialized(scope), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onScopeInitialized(scope._id), ); } @@ -33,15 +37,15 @@ class ScopeListenerInternal implements RawScopeListener { Object exception, StackTrace stackTrace, ) { - RawScopeListener.override?.safeNotify( + RawScopeObserver.override?.safeNotify( (listener) => listener.onScopeInitializeFailed( scope, exception, stackTrace, ), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onScopeInitializeFailed( scope._id, exception, @@ -52,22 +56,22 @@ class ScopeListenerInternal implements RawScopeListener { @override void onScopeStartDispose(BaseScopeContainer scope) { - RawScopeListener.override?.safeNotify( + RawScopeObserver.override?.safeNotify( (listener) => listener.onScopeStartDispose(scope), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onScopeStartDispose(scope._id), ); } @override void onScopeDisposed(BaseScopeContainer scope) { - RawScopeListener.override?.safeNotify( + RawScopeObserver.override?.safeNotify( (listener) => listener.onScopeDisposed(scope), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onScopeDisposed(scope._id), ); } @@ -79,7 +83,7 @@ class ScopeListenerInternal implements RawScopeListener { Object exception, StackTrace stackTrace, ) { - RawScopeListener.override?.safeNotify( + RawScopeObserver.override?.safeNotify( (listener) => listener.onScopeDisposeDepFailed( scope, dep, @@ -87,8 +91,8 @@ class ScopeListenerInternal implements RawScopeListener { stackTrace, ), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onScopeDisposeDepFailed( scope._id, dep._id, @@ -99,28 +103,32 @@ class ScopeListenerInternal implements RawScopeListener { } } -class DepListenerInternal { +/// DO NOT USE THIS CLASS MANUALLY +/// +/// [RawDepObserver] implementation for [Dep] that notifies +/// [DepObserver]s +class DepObserverInternal { final BaseScopeContainer _scope; - List? _listeners; + List? _observers; - DepListenerInternal(this._scope); + DepObserverInternal(this._scope); void onValueStartCreate(Dep dep) { - RawDepListener.override?.safeNotify( + RawDepObserver.override?.safeNotify( (listener) => listener.onValueStartCreate(_scope, dep), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onValueStartCreate(_scope._id, dep._id), ); } void onValueCreated(Dep dep, Object? value) { - RawDepListener.override?.safeNotify( + RawDepObserver.override?.safeNotify( (listener) => listener.onValueCreated(_scope, dep, value), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onValueCreated( _scope._id, dep._id, @@ -134,7 +142,7 @@ class DepListenerInternal { Object exception, StackTrace stackTrace, ) { - RawDepListener.override?.safeNotify( + RawDepObserver.override?.safeNotify( (listener) => listener.onValueCreateFailed( _scope, dep, @@ -142,8 +150,8 @@ class DepListenerInternal { stackTrace, ), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onValueCreateFailed( _scope._id, dep._id, @@ -154,11 +162,11 @@ class DepListenerInternal { } void onValueCleared(Dep dep, Object? value) { - RawDepListener.override?.safeNotify( + RawDepObserver.override?.safeNotify( (listener) => listener.onValueCleared(_scope, dep, value), ); - _safeNotifyAll( - _listeners, + _safeNotifyAll( + _observers, (listener) => listener.onValueCleared( _scope._id, dep._id, @@ -168,47 +176,51 @@ class DepListenerInternal { } } -class AsyncDepListenerInternal extends DepListenerInternal { - List? _asyncDepListeners; +/// DO NOT USE THIS CLASS MANUALLY +/// +/// [RawDepObserver] implementation for [AsyncDep] that notifies +/// [AsyncDepObserver]s +class AsyncDepObserverInternal extends DepObserverInternal { + List? _asyncDepObservers; - AsyncDepListenerInternal(BaseScopeContainer scope) : super(scope); + AsyncDepObserverInternal(BaseScopeContainer scope) : super(scope); void onDepStartInitialize(Dep dep) { - RawAsyncDepListener.override?.safeNotify( + RawAsyncDepObserver.override?.safeNotify( (listener) => listener.onDepStartInitialize(_scope, dep), ); - _safeNotifyAll( - _asyncDepListeners, + _safeNotifyAll( + _asyncDepObservers, (listener) => listener.onDepStartInitialize(_scope._id, dep._id), ); } void onDepInitialized(Dep dep) { - RawAsyncDepListener.override?.safeNotify( + RawAsyncDepObserver.override?.safeNotify( (listener) => listener.onDepInitialized(_scope, dep), ); - _safeNotifyAll( - _asyncDepListeners, + _safeNotifyAll( + _asyncDepObservers, (listener) => listener.onDepInitialized(_scope._id, dep._id), ); } void onDepStartDispose(Dep dep) { - RawAsyncDepListener.override?.safeNotify( + RawAsyncDepObserver.override?.safeNotify( (listener) => listener.onDepStartDispose(_scope, dep), ); - _safeNotifyAll( - _asyncDepListeners, + _safeNotifyAll( + _asyncDepObservers, (listener) => listener.onDepStartDispose(_scope._id, dep._id), ); } void onDepDisposed(Dep dep) { - RawAsyncDepListener.override?.safeNotify( + RawAsyncDepObserver.override?.safeNotify( (listener) => listener.onDepDisposed(_scope, dep), ); - _safeNotifyAll( - _asyncDepListeners, + _safeNotifyAll( + _asyncDepObservers, (listener) => listener.onDepDisposed(_scope._id, dep._id), ); } @@ -218,7 +230,7 @@ class AsyncDepListenerInternal extends DepListenerInternal { Object exception, StackTrace stackTrace, ) { - RawAsyncDepListener.override?.safeNotify( + RawAsyncDepObserver.override?.safeNotify( (listener) => listener.onDepInitializeFailed( _scope, dep, @@ -226,8 +238,8 @@ class AsyncDepListenerInternal extends DepListenerInternal { stackTrace, ), ); - _safeNotifyAll( - _asyncDepListeners, + _safeNotifyAll( + _asyncDepObservers, (listener) => listener.onDepInitializeFailed( _scope._id, dep._id, @@ -242,7 +254,7 @@ class AsyncDepListenerInternal extends DepListenerInternal { Object exception, StackTrace stackTrace, ) { - RawAsyncDepListener.override?.safeNotify( + RawAsyncDepObserver.override?.safeNotify( (listener) => listener.onDepDisposeFailed( _scope, dep, @@ -250,8 +262,8 @@ class AsyncDepListenerInternal extends DepListenerInternal { stackTrace, ), ); - _safeNotifyAll( - _asyncDepListeners, + _safeNotifyAll( + _asyncDepObservers, (listener) => listener.onDepDisposeFailed( _scope._id, dep._id, diff --git a/packages/yx_scope/lib/src/monitoring/raw_listeners.dart b/packages/yx_scope/lib/src/monitoring/raw_listeners.dart index d341db4..2d18c2c 100644 --- a/packages/yx_scope/lib/src/monitoring/raw_listeners.dart +++ b/packages/yx_scope/lib/src/monitoring/raw_listeners.dart @@ -1,80 +1,28 @@ -import '../base_scope_container.dart'; +part of 'raw_observers.dart'; -/// Consider using [ScopeListener], [DepListener] and [AsyncDepListener] instead — these are listeners with a safe read-only access. -/// [RawScopeListener], [RawDepListener] and [RawAsyncDepListener] are an advanced direct access for rare cases. -/// So if you are not sure if this is the right choice for you then it's probably not. -/// -/// [RawScopeListener] is the listener with a direct access to [BaseScopeContainer] and [Dep]. -abstract class RawScopeListener { - static RawScopeListener? override; +@Deprecated('Use RawScopeObserver instead') +abstract class RawScopeListener extends RawScopeObserver { + static set override(RawScopeObserver? override) => + RawScopeObserver.override = override; - RawScopeListener._(); + static RawScopeObserver? get override => RawScopeObserver.override; - void onScopeStartInitialize(BaseScopeContainer scope); - - void onScopeInitialized(BaseScopeContainer scope); - - void onScopeInitializeFailed( - BaseScopeContainer scope, - Object exception, - StackTrace stackTrace, - ); - - void onScopeStartDispose(BaseScopeContainer scope); - - void onScopeDisposed(BaseScopeContainer scope); - - void onScopeDisposeDepFailed( - BaseScopeContainer scope, - Dep dep, - Object exception, - StackTrace stackTrace, - ); + RawScopeListener._() : super._(); } -/// [RawDepListener] is the listener with a direct access to [BaseScopeContainer], [Dep] and created instance. -/// More details in [RawScopeListener] -abstract class RawDepListener { - static RawDepListener? override; - - void onValueStartCreate(BaseScopeContainer scope, Dep dep); - - void onValueCreated(BaseScopeContainer scope, Dep dep, Object? value); +@Deprecated('Use RawDepObserver instead') +abstract class RawDepListener extends RawDepObserver { + static set override(RawDepObserver? override) => + RawDepObserver.override = override; - void onValueCreateFailed( - BaseScopeContainer scope, - Dep dep, - Object exception, - StackTrace stackTrace, - ); - - void onValueCleared(BaseScopeContainer scope, Dep dep, Object? value); + static RawDepObserver? get override => RawDepObserver.override; } -/// [RawAsyncDepListener] is the listener with a direct access to [BaseScopeContainer] and [Dep]. -/// More details in [RawScopeListener] -abstract class RawAsyncDepListener implements RawDepListener { - static RawAsyncDepListener? override; - - void onDepStartInitialize(BaseScopeContainer scope, Dep dep); - - void onDepInitialized(BaseScopeContainer scope, Dep dep); - - void onDepStartDispose(BaseScopeContainer scope, Dep dep); - - void onDepDisposed(BaseScopeContainer scope, Dep dep); - - void onDepInitializeFailed( - BaseScopeContainer scope, - Dep dep, - Object exception, - StackTrace stackTrace, - ); +@Deprecated('Use RawAsyncDepObserver instead') +abstract class RawAsyncDepListener extends RawAsyncDepObserver + implements RawDepListener { + static set override(RawAsyncDepObserver? override) => + RawAsyncDepObserver.override = override; - void onDepDisposeFailed( - BaseScopeContainer scope, - Dep dep, - Object exception, - StackTrace stackTrace, - ); + static RawAsyncDepObserver? get override => RawAsyncDepObserver.override; } diff --git a/packages/yx_scope/lib/src/monitoring/raw_observers.dart b/packages/yx_scope/lib/src/monitoring/raw_observers.dart new file mode 100644 index 0000000..e17d865 --- /dev/null +++ b/packages/yx_scope/lib/src/monitoring/raw_observers.dart @@ -0,0 +1,82 @@ +import '../base_scope_container.dart'; + +part 'raw_listeners.dart'; + +/// Consider using [ScopeObserver], [DepObserver] and [AsyncDepObserver] instead — these are Observers with a safe read-only access. +/// [RawScopeObserver], [RawDepObserver] and [RawAsyncDepObserver] are an advanced direct access for rare cases. +/// So if you are not sure if this is the right choice for you then it's probably not. +/// +/// [RawScopeObserver] is the Observer with a direct access to [BaseScopeContainer] and [Dep]. +abstract class RawScopeObserver { + static RawScopeObserver? override; + + RawScopeObserver._(); + + void onScopeStartInitialize(BaseScopeContainer scope); + + void onScopeInitialized(BaseScopeContainer scope); + + void onScopeInitializeFailed( + BaseScopeContainer scope, + Object exception, + StackTrace stackTrace, + ); + + void onScopeStartDispose(BaseScopeContainer scope); + + void onScopeDisposed(BaseScopeContainer scope); + + void onScopeDisposeDepFailed( + BaseScopeContainer scope, + Dep dep, + Object exception, + StackTrace stackTrace, + ); +} + +/// [RawDepObserver] is the Observer with a direct access to [BaseScopeContainer], [Dep] and created instance. +/// More details in [RawScopeObserver] +abstract class RawDepObserver { + static RawDepObserver? override; + + void onValueStartCreate(BaseScopeContainer scope, Dep dep); + + void onValueCreated(BaseScopeContainer scope, Dep dep, Object? value); + + void onValueCreateFailed( + BaseScopeContainer scope, + Dep dep, + Object exception, + StackTrace stackTrace, + ); + + void onValueCleared(BaseScopeContainer scope, Dep dep, Object? value); +} + +/// [RawAsyncDepObserver] is the Observer with a direct access to [BaseScopeContainer] and [Dep]. +/// More details in [RawScopeObserver] +abstract class RawAsyncDepObserver implements RawDepObserver { + static RawAsyncDepObserver? override; + + void onDepStartInitialize(BaseScopeContainer scope, Dep dep); + + void onDepInitialized(BaseScopeContainer scope, Dep dep); + + void onDepStartDispose(BaseScopeContainer scope, Dep dep); + + void onDepDisposed(BaseScopeContainer scope, Dep dep); + + void onDepInitializeFailed( + BaseScopeContainer scope, + Dep dep, + Object exception, + StackTrace stackTrace, + ); + + void onDepDisposeFailed( + BaseScopeContainer scope, + Dep dep, + Object exception, + StackTrace stackTrace, + ); +} diff --git a/packages/yx_scope/lib/src/scope_holder.dart b/packages/yx_scope/lib/src/scope_holder.dart index cc50dab..162ca04 100644 --- a/packages/yx_scope/lib/src/scope_holder.dart +++ b/packages/yx_scope/lib/src/scope_holder.dart @@ -43,12 +43,23 @@ part of 'base_scope_container.dart'; abstract class ScopeHolder extends BaseScopeHolder { ScopeHolder({ + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ); } @@ -89,13 +100,24 @@ abstract class ChildScopeHolder, extends BaseChildScopeHolder { ChildScopeHolder( Parent parent, { + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( parent, + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ); } @@ -126,12 +148,23 @@ abstract class DataScopeHolder, Data extends Object> extends BaseDataScopeHolder { DataScopeHolder({ + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ); } @@ -175,13 +208,24 @@ abstract class ChildDataScopeHolder< extends BaseChildDataScopeHolder { ChildDataScopeHolder( Parent parent, { + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( parent, + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ); } @@ -197,12 +241,23 @@ abstract class ChildDataScopeHolder< abstract class BaseScopeHolder extends CoreScopeHolder { BaseScopeHolder({ + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ); @@ -230,12 +285,23 @@ abstract class BaseChildScopeHolder< with _BaseChildScopeHolderMixin { BaseChildScopeHolder( Parent parent, { + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ) { this.parent = parent; @@ -261,12 +327,23 @@ abstract class BaseDataScopeHolder< Data extends Object> extends CoreScopeHolder with _BaseDataScopeHolderMixin { BaseDataScopeHolder({ + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ); @@ -297,12 +374,23 @@ abstract class BaseChildDataScopeHolder< _BaseDataScopeHolderMixin { BaseChildDataScopeHolder( Parent parent, { + @Deprecated('Use scopeObservers instead') List? scopeListeners, - List? depListeners, + @Deprecated('Use depObservers instead') List? depListeners, + @Deprecated('Use asyncDepObservers instead') List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, }) : super( + scopeObservers: scopeObservers, + depObservers: depObservers, + asyncDepObservers: asyncDepObservers, + // ignore: deprecated_member_use_from_same_package scopeListeners: scopeListeners, + // ignore: deprecated_member_use_from_same_package depListeners: depListeners, + // ignore: deprecated_member_use_from_same_package asyncDepListeners: asyncDepListeners, ) { this.parent = parent; diff --git a/packages/yx_scope/lib/yx_scope.dart b/packages/yx_scope/lib/yx_scope.dart index 849553a..91daad5 100644 --- a/packages/yx_scope/lib/yx_scope.dart +++ b/packages/yx_scope/lib/yx_scope.dart @@ -2,14 +2,14 @@ library yx_scope; export 'src/base_scope_container.dart' hide - ScopeListenerInternal, - DepListenerInternal, - AsyncDepListenerInternal, + ScopeObserverInternal, + DepObserverInternal, + AsyncDepObserverInternal, Entry, TestableScopeStateHolder; export 'src/core/async_lifecycle.dart'; export 'src/core/scope_exception.dart'; -export 'src/monitoring/listeners.dart'; +export 'src/monitoring/observers.dart'; export 'src/monitoring/models/dep_id.dart'; export 'src/monitoring/models/scope_id.dart'; export 'src/monitoring/models/value_meta.dart'; diff --git a/packages/yx_scope/test/dep_test.dart b/packages/yx_scope/test/dep_test.dart index d435140..58bf285 100644 --- a/packages/yx_scope/test/dep_test.dart +++ b/packages/yx_scope/test/dep_test.dart @@ -1,12 +1,13 @@ import 'package:test/test.dart'; import 'package:yx_scope/advanced.dart'; +import 'package:yx_scope/src/monitoring/raw_observers.dart'; import 'package:yx_scope/yx_scope.dart'; import 'utils/test_logger.dart'; import 'utils/utils.dart'; void main() { - final listener = _TestListener(); + final observer = _TestObserver(); setUp(() { _TestDep.instances.clear(); @@ -14,16 +15,16 @@ void main() { _TestAsyncDep.instances.clear(); ScopeObservatory.logger = const TestLogger(); - RawScopeListener.override = listener; - RawDepListener.override = listener; - RawAsyncDepListener.override = listener; + RawScopeObserver.override = observer; + RawDepObserver.override = observer; + RawAsyncDepObserver.override = observer; }); tearDown(() { - listener.scopeDeps.clear(); - RawScopeListener.override = null; - RawDepListener.override = null; - RawAsyncDepListener.override = null; + observer.scopeDeps.clear(); + RawScopeObserver.override = null; + RawDepObserver.override = null; + RawAsyncDepObserver.override = null; }); group('sync dependencies', () { @@ -47,11 +48,11 @@ void main() { test('dep is registered in observer lazily', () { final scope = _TestScope(); - expect(listener.scopeDeps['_TestScope'], isNull); + expect(observer.scopeDeps['_TestScope'], isNull); final dep = scope.myDep.get; expect( - listener.scopeDeps['_TestScope']?.first, + observer.scopeDeps['_TestScope']?.first, dep.runtimeType.toString(), ); }); @@ -60,24 +61,24 @@ void main() { 'dependencies with the same type but different names' ' is registered separately in observer', () { final scope = _TestScope(); - expect(listener.scopeDeps['_TestScope'], isNull); + expect(observer.scopeDeps['_TestScope'], isNull); final dep1 = scope.myDep.get; expect( - listener.scopeContainsDep('_TestScope', dep1.runtimeType.toString()), + observer.scopeContainsDep('_TestScope', dep1.runtimeType.toString()), isTrue, ); final dep2 = scope.myDuplicatedDep.get; expect( - listener.scopeContainsDep('_TestScope', dep2.runtimeType.toString()), + observer.scopeContainsDep('_TestScope', dep2.runtimeType.toString()), isTrue, ); }); test('dep returns non-nullable value', () { final scope = _TestScope(); - expect(listener.scopeDeps['_TestScope'], isNull); + expect(observer.scopeDeps['_TestScope'], isNull); final dep = scope.myNullableDep.get; expect( @@ -85,7 +86,7 @@ void main() { isNotNull, ); expect( - listener.scopeDeps['_TestScope']?.first + observer.scopeDeps['_TestScope']?.first .startsWith(dep.runtimeType.toString()), isTrue, ); @@ -93,7 +94,7 @@ void main() { test('dep returns null value', () { final scope = _TestScope(isNullableDep: true); - expect(listener.scopeDeps['_TestScope'], isNull); + expect(observer.scopeDeps['_TestScope'], isNull); final dep = scope.myNullableDep.get; expect( @@ -253,10 +254,10 @@ class _TestAsyncDepScopeHolder extends ScopeHolder<_TestAsyncDepScope> { _TestAsyncDepScope createContainer() => _TestAsyncDepScope(); } -class _TestListener implements RawScopeListener, RawAsyncDepListener { +class _TestObserver implements RawScopeObserver, RawAsyncDepObserver { final scopeDeps = >{}; - _TestListener(); + _TestObserver(); @override void onDepDisposeFailed( diff --git a/packages/yx_scope/test/deprecated_listeners_test.dart b/packages/yx_scope/test/deprecated_listeners_test.dart new file mode 100644 index 0000000..45ac1c4 --- /dev/null +++ b/packages/yx_scope/test/deprecated_listeners_test.dart @@ -0,0 +1,65 @@ +import 'package:test/test.dart'; +import 'package:yx_scope/yx_scope.dart'; + +class AppScopeContainer extends ScopeContainer {} + +class AppScopeHolder extends ScopeHolder { + AppScopeHolder({ + // ignore: deprecated_member_use_from_same_package + List? scopeListeners, + // ignore: deprecated_member_use_from_same_package + List? depListeners, + // ignore: deprecated_member_use_from_same_package + List? asyncDepListeners, + List? scopeObservers, + List? depObservers, + List? asyncDepObservers, + }) : super( + // ignore: deprecated_member_use_from_same_package + scopeListeners: scopeListeners, + scopeObservers: scopeObservers, + // ignore: deprecated_member_use_from_same_package + depListeners: depListeners, + depObservers: depObservers, + // ignore: deprecated_member_use_from_same_package + asyncDepListeners: asyncDepListeners, + asyncDepObservers: asyncDepObservers, + ); + @override + AppScopeContainer createContainer() => AppScopeContainer(); +} + +void main() { + test( + 'Fail assert if both scopeListeners and scopeObservers passed to ScopeHolder', + () { + expect( + () => AppScopeHolder(scopeListeners: [], scopeObservers: []), + throwsA( + isA(), + ), + ); + }); + + test( + 'Fail assert if both depListeners and depObservers passed to ScopeHolder', + () { + expect( + () => AppScopeHolder(depListeners: [], depObservers: []), + throwsA( + isA(), + ), + ); + }); + + test( + 'Fail assert if both asyncDepListeners and asyncDepObservers passed to ScopeHolder', + () { + expect( + () => AppScopeHolder(asyncDepListeners: [], asyncDepObservers: []), + throwsA( + isA(), + ), + ); + }); +} diff --git a/packages/yx_scope/test/listeners_test.dart b/packages/yx_scope/test/observers_test.dart similarity index 97% rename from packages/yx_scope/test/listeners_test.dart rename to packages/yx_scope/test/observers_test.dart index 10091e8..442902a 100644 --- a/packages/yx_scope/test/listeners_test.dart +++ b/packages/yx_scope/test/observers_test.dart @@ -11,7 +11,7 @@ void main() { }); test('success calls in correct order with correct params', () async { - final listener = TestListener(); + final listener = TestObserver(); final holder = _TestScopeHolder(listener); await holder.create(); @@ -98,7 +98,7 @@ void main() { }); test('init failure calls in correct order with correct params', () async { - final listener = TestListener(); + final listener = TestObserver(); final holder = _BrokenAsyncDepScopeHolder(listener); try { @@ -204,7 +204,7 @@ void main() { }); test('dispose calls in correct order with correct params', () async { - final listener = TestListener(); + final listener = TestObserver(); final holder = _BrokenAsyncDepScopeHolder(listener, checkDispose: true); await holder.create(); @@ -324,7 +324,7 @@ void main() { }); test('create failure calls in correct order with correct params', () async { - final listener = TestListener(); + final listener = TestObserver(); final holder = _BrokenAsyncDepScopeHolder(listener, checkDispose: true); await holder.create(); @@ -468,7 +468,7 @@ void main() { }); } -class ListenerEvent { +class ObserverEvent { final String name; final ScopeId scope; final DepId? dep; @@ -476,7 +476,7 @@ class ListenerEvent { final Object? exception; final StackTrace? stackTrace; - ListenerEvent({ + ObserverEvent({ required this.name, required this.scope, this.dep, @@ -487,14 +487,14 @@ class ListenerEvent { @override String toString() => - 'ListenerEvent{name: $name, scope: $scope, dep: $dep, value: $value, ' + 'ObserverEvent{name: $name, scope: $scope, dep: $dep, value: $value, ' 'exception: $exception, stackTrace: $stackTrace}'; } -class TestListener implements ScopeListener, DepListener, AsyncDepListener { - final _events = []; +class TestObserver implements ScopeObserver, DepObserver, AsyncDepObserver { + final _events = []; - TestListener(); + TestObserver(); void _log( String name, @@ -509,7 +509,7 @@ class TestListener implements ScopeListener, DepListener, AsyncDepListener { print('$exception\n$stackTrace'); } _events.add( - ListenerEvent( + ObserverEvent( name: name, scope: scope, dep: dep, @@ -647,11 +647,11 @@ class _TestScopeContainer extends ScopeContainer { } class _TestScopeHolder extends ScopeHolder<_TestScopeContainer> { - _TestScopeHolder(TestListener listener) + _TestScopeHolder(TestObserver listener) : super( - scopeListeners: [listener], - depListeners: [listener], - asyncDepListeners: [listener], + scopeObservers: [listener], + depObservers: [listener], + asyncDepObservers: [listener], ); @override @@ -693,11 +693,11 @@ class _BrokenAsyncDepScopeHolder extends ScopeHolder<_BrokenAsyncDepScopeContainer> { final bool checkDispose; - _BrokenAsyncDepScopeHolder(TestListener listener, {this.checkDispose = false}) + _BrokenAsyncDepScopeHolder(TestObserver listener, {this.checkDispose = false}) : super( - scopeListeners: [listener], - depListeners: [listener], - asyncDepListeners: [listener], + scopeObservers: [listener], + depObservers: [listener], + asyncDepObservers: [listener], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/account/account_scope.dart b/packages/yx_scope_flutter/example/lib/di/account/account_scope.dart index d22c955..95e26e7 100644 --- a/packages/yx_scope_flutter/example/lib/di/account/account_scope.dart +++ b/packages/yx_scope_flutter/example/lib/di/account/account_scope.dart @@ -80,9 +80,9 @@ class AccountScopeHolder extends BaseChildDataScopeHolder< Account> implements AccountHolder { AccountScopeHolder(super.parent) : super( - scopeListeners: [diListener], - depListeners: [diListener], - asyncDepListeners: [diListener], + scopeObservers: [diObserver], + depObservers: [diObserver], + asyncDepObservers: [diObserver], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/app/app_scope.dart b/packages/yx_scope_flutter/example/lib/di/app/app_scope.dart index 71f4d0e..0e1bb23 100644 --- a/packages/yx_scope_flutter/example/lib/di/app/app_scope.dart +++ b/packages/yx_scope_flutter/example/lib/di/app/app_scope.dart @@ -40,9 +40,9 @@ class AppScopeContainer extends ScopeContainer { class AppScopeHolder extends ScopeHolder { AppScopeHolder() : super( - scopeListeners: [diListener], - depListeners: [diListener], - asyncDepListeners: [diListener], + scopeObservers: [diObserver], + depObservers: [diObserver], + asyncDepObservers: [diObserver], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/map/map_scope.dart b/packages/yx_scope_flutter/example/lib/di/map/map_scope.dart index 533e667..2e1ce11 100644 --- a/packages/yx_scope_flutter/example/lib/di/map/map_scope.dart +++ b/packages/yx_scope_flutter/example/lib/di/map/map_scope.dart @@ -50,9 +50,9 @@ class MapScopeHolder implements MapInitializer { MapScopeHolder() : super( - scopeListeners: [diListener], - depListeners: [diListener], - asyncDepListeners: [diListener], + scopeObservers: [diObserver], + depObservers: [diObserver], + asyncDepObservers: [diObserver], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/map_navigation/map_navigation_scope.dart b/packages/yx_scope_flutter/example/lib/di/map_navigation/map_navigation_scope.dart index bc1a02f..55910ec 100644 --- a/packages/yx_scope_flutter/example/lib/di/map_navigation/map_navigation_scope.dart +++ b/packages/yx_scope_flutter/example/lib/di/map_navigation/map_navigation_scope.dart @@ -45,9 +45,9 @@ class MapNavigationScopeHolder extends BaseChildDataScopeHolder< MapNavigationParams> implements MapNavigationHolder { MapNavigationScopeHolder(super.parent) : super( - scopeListeners: [diListener], - depListeners: [diListener], - asyncDepListeners: [diListener], + scopeObservers: [diObserver], + depObservers: [diObserver], + asyncDepObservers: [diObserver], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/online_order/online_scope.dart b/packages/yx_scope_flutter/example/lib/di/online_order/online_scope.dart index c574c74..2274da4 100644 --- a/packages/yx_scope_flutter/example/lib/di/online_order/online_scope.dart +++ b/packages/yx_scope_flutter/example/lib/di/online_order/online_scope.dart @@ -40,9 +40,9 @@ class OnlineScopeHolder extends BaseChildScopeHolder implements OnlineOrderStateHolder { OnlineScopeHolder(super.parent) : super( - scopeListeners: [diListener], - depListeners: [diListener], - asyncDepListeners: [diListener], + scopeObservers: [diObserver], + depObservers: [diObserver], + asyncDepObservers: [diObserver], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/order/order_scope.dart b/packages/yx_scope_flutter/example/lib/di/order/order_scope.dart index 55dda8a..4ec2068 100644 --- a/packages/yx_scope_flutter/example/lib/di/order/order_scope.dart +++ b/packages/yx_scope_flutter/example/lib/di/order/order_scope.dart @@ -102,9 +102,9 @@ class OrderScopeHolder extends BaseChildDataScopeHolder { OrderScopeHolder(super.parent) : super( - scopeListeners: [diListener], - depListeners: [diListener], - asyncDepListeners: [diListener], + scopeObservers: [diObserver], + depObservers: [diObserver], + asyncDepObservers: [diObserver], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/register/register_scope.dart b/packages/yx_scope_flutter/example/lib/di/register/register_scope.dart index 4e9f754..aa1707a 100644 --- a/packages/yx_scope_flutter/example/lib/di/register/register_scope.dart +++ b/packages/yx_scope_flutter/example/lib/di/register/register_scope.dart @@ -21,9 +21,9 @@ class RegisterScopeHolder implements RegisterHolder { RegisterScopeHolder(super.parent) : super( - scopeListeners: [diListener], - depListeners: [diListener], - asyncDepListeners: [diListener], + scopeObservers: [diObserver], + depObservers: [diObserver], + asyncDepObservers: [diObserver], ); @override diff --git a/packages/yx_scope_flutter/example/lib/di/utils/listeners.dart b/packages/yx_scope_flutter/example/lib/di/utils/listeners.dart index 18075bb..31a9e4e 100644 --- a/packages/yx_scope_flutter/example/lib/di/utils/listeners.dart +++ b/packages/yx_scope_flutter/example/lib/di/utils/listeners.dart @@ -1,10 +1,10 @@ import 'package:flutter/foundation.dart'; import 'package:yx_scope/yx_scope.dart'; -const diListener = DIListener(); +const diObserver = DIObserver(); -class DIListener implements ScopeListener, DepListener, AsyncDepListener { - const DIListener(); +class DIObserver implements ScopeObserver, DepObserver, AsyncDepObserver { + const DIObserver(); static void _log( String message, [ diff --git a/packages/yx_scope_flutter/example/lib/main.dart b/packages/yx_scope_flutter/example/lib/main.dart index 2470d5a..f2a1e3c 100644 --- a/packages/yx_scope_flutter/example/lib/main.dart +++ b/packages/yx_scope_flutter/example/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:yx_scope/yx_scope.dart' hide ScopeListener; +import 'package:yx_scope/yx_scope.dart'; import 'package:yx_scope_flutter/yx_scope_flutter.dart'; import 'di/app/app_scope.dart';