From a9febbc2a7e6e68b5073fce553c98baba68b26ac Mon Sep 17 00:00:00 2001 From: Seven Du Date: Sat, 18 Jan 2025 02:20:05 +0800 Subject: [PATCH] refactor: system alien_signals --- .../lib/src/_internal/signals_element.dart | 13 ++++++----- .../lib/src/_internal/utils.dart | 23 +++++++++++-------- .../lib/src/api_batch.dart | 2 +- .../lib/src/api_computed.dart | 2 +- .../lib/src/api_effect.dart | 9 ++++---- .../lib/src/api_effect_scope.dart | 11 +++++---- .../lib/src/api_signal.dart | 4 ++-- pub/flutter_alien_signals/lib/src/compat.dart | 10 ++++---- .../lib/src/mixins/signals.dart | 13 +++++++---- .../lib/src/mixins/state_signals.dart | 20 ++++++++-------- .../lib/src/upstream.dart | 12 ++-------- .../lib/src/widgets/signal_observer.dart | 2 +- pub/flutter_alien_signals/pubspec.yaml | 4 ++-- 13 files changed, 65 insertions(+), 60 deletions(-) diff --git a/pub/flutter_alien_signals/lib/src/_internal/signals_element.dart b/pub/flutter_alien_signals/lib/src/_internal/signals_element.dart index d47b107..2dc1f43 100644 --- a/pub/flutter_alien_signals/lib/src/_internal/signals_element.dart +++ b/pub/flutter_alien_signals/lib/src/_internal/signals_element.dart @@ -1,4 +1,5 @@ import 'package:alien_signals/alien_signals.dart'; +import 'package:alien_signals/preset.dart'; import 'package:flutter/widgets.dart'; import 'utils.dart'; @@ -6,8 +7,8 @@ import 'utils.dart'; SignalsElement? currentElement; mixin SignalsElement on ComponentElement { - EffectScope get scope; - Effect get effect; + EffectStop get scopeStop; + EffectStop get effectStop; final signals = []; final subs = []; @@ -17,7 +18,7 @@ mixin SignalsElement on ComponentElement { @override Widget build() { final prevElement = currentElement; - final reset = effect.on(scope); + final reset = effectStop.sub.on(scopeStop.sub); currentElement = this; signalCounter = subCounter = 0; try { @@ -32,8 +33,8 @@ mixin SignalsElement on ComponentElement { if (stopSubs.isEmpty) { for (final sub in stopSubs) { - startTrack(sub); - endTrack(sub); + system.startTracking(sub); + system.endTracking(sub); } } } @@ -43,7 +44,7 @@ mixin SignalsElement on ComponentElement { void unmount() { signals.clear(); subs.clear(); - scope.stop(); + scopeStop(); super.unmount(); } } diff --git a/pub/flutter_alien_signals/lib/src/_internal/utils.dart b/pub/flutter_alien_signals/lib/src/_internal/utils.dart index 8a1f2ea..c46b2cd 100644 --- a/pub/flutter_alien_signals/lib/src/_internal/utils.dart +++ b/pub/flutter_alien_signals/lib/src/_internal/utils.dart @@ -1,23 +1,28 @@ -import 'package:alien_signals/alien_signals.dart'; +import 'package:alien_signals/preset.dart'; + +void loop() {} extension EffectScopeUtils on EffectScope { void Function() on() { - final prevScope = activeEffectScope; - setActiveScope(this); - return () => setActiveScope(prevScope); + final prevScope = system.activeScope; + system.activeScope = this; + return () { + system.activeScope = prevScope; + }; } } extension EffectUtils on Effect { void Function() on([EffectScope? scope]) { final reset = scope?.on(); - final prevSub = activeSub; - setActiveSub(this); - startTrack(this); + final prevSub = system.activeSub; + + system.activeSub = this; + system.startTracking(this); return () { reset?.call(); - setActiveSub(prevSub); - endTrack(this); + system.activeSub = prevSub; + system.endTracking(this); }; } } diff --git a/pub/flutter_alien_signals/lib/src/api_batch.dart b/pub/flutter_alien_signals/lib/src/api_batch.dart index 81ade24..96352b4 100644 --- a/pub/flutter_alien_signals/lib/src/api_batch.dart +++ b/pub/flutter_alien_signals/lib/src/api_batch.dart @@ -1,4 +1,4 @@ -import 'package:alien_signals/alien_signals.dart'; +import 'package:alien_signals/preset.dart'; T batch(T Function() fn) { startBatch(); diff --git a/pub/flutter_alien_signals/lib/src/api_computed.dart b/pub/flutter_alien_signals/lib/src/api_computed.dart index 9dca935..768c510 100644 --- a/pub/flutter_alien_signals/lib/src/api_computed.dart +++ b/pub/flutter_alien_signals/lib/src/api_computed.dart @@ -1,4 +1,4 @@ -import 'package:alien_signals/alien_signals.dart' as alien; +import 'package:alien_signals/preset.dart' as alien; import '_internal/callonce.dart'; import '_internal/signals_element.dart'; diff --git a/pub/flutter_alien_signals/lib/src/api_effect.dart b/pub/flutter_alien_signals/lib/src/api_effect.dart index 588a9af..3b45fc6 100644 --- a/pub/flutter_alien_signals/lib/src/api_effect.dart +++ b/pub/flutter_alien_signals/lib/src/api_effect.dart @@ -1,20 +1,21 @@ -import 'package:alien_signals/alien_signals.dart' as alien; +import 'package:alien_signals/preset.dart' as alien; import '_internal/callonce.dart'; import '_internal/signals_element.dart'; -alien.Effect effect(T Function() fn) { +alien.EffectStop effect(T Function() fn) { if (currentElement == null) { return alien.effect(fn); } final element = currentElement!, subs = element.subs; try { - return callonce( - factory: () => alien.effect(fn), + final effect = callonce( + factory: () => alien.effect(fn).sub, container: subs, index: element.subCounter, ); + return alien.EffectStop(effect); } finally { element.subCounter++; } diff --git a/pub/flutter_alien_signals/lib/src/api_effect_scope.dart b/pub/flutter_alien_signals/lib/src/api_effect_scope.dart index 4e49d08..d15c233 100644 --- a/pub/flutter_alien_signals/lib/src/api_effect_scope.dart +++ b/pub/flutter_alien_signals/lib/src/api_effect_scope.dart @@ -1,20 +1,21 @@ -import 'package:alien_signals/alien_signals.dart' as alien; +import 'package:alien_signals/preset.dart' as alien; import '_internal/callonce.dart'; import '_internal/signals_element.dart'; -alien.EffectScope effectScope() { +alien.EffectStop effectScope(void Function() fn) { if (currentElement == null) { - return alien.effectScope(); + return alien.effectScope(fn); } final element = currentElement!, subs = element.subs; try { - return callonce( - factory: alien.effectScope, + final scope = callonce( + factory: () => alien.effectScope(fn).sub, container: subs, index: element.subCounter, ); + return alien.EffectStop(scope); } finally { element.subCounter++; } diff --git a/pub/flutter_alien_signals/lib/src/api_signal.dart b/pub/flutter_alien_signals/lib/src/api_signal.dart index 0fc9489..3c5727b 100644 --- a/pub/flutter_alien_signals/lib/src/api_signal.dart +++ b/pub/flutter_alien_signals/lib/src/api_signal.dart @@ -1,9 +1,9 @@ -import 'package:alien_signals/alien_signals.dart' as alien; +import 'package:alien_signals/preset.dart' as alien; import '_internal/callonce.dart'; import '_internal/signals_element.dart'; -alien.Signal signal(T value) { +alien.WriteableSignal signal(T value) { if (currentElement == null) { return alien.signal(value); } diff --git a/pub/flutter_alien_signals/lib/src/compat.dart b/pub/flutter_alien_signals/lib/src/compat.dart index 3588abe..a452b0d 100644 --- a/pub/flutter_alien_signals/lib/src/compat.dart +++ b/pub/flutter_alien_signals/lib/src/compat.dart @@ -1,10 +1,10 @@ import 'upstream.dart'; -extension ValueSignal on ISignal { - T get value => get(); +extension ValueSignal on Signal { + T get value => this(); } -extension ValueWritableSignal on IWritableSignal { - T get value => get(); - set value(T value) => set(value); +extension ValueWritableSignal on WriteableSignal { + T get value => this(); + set value(T value) => this(value); } diff --git a/pub/flutter_alien_signals/lib/src/mixins/signals.dart b/pub/flutter_alien_signals/lib/src/mixins/signals.dart index 3f1754d..4d0f0ad 100644 --- a/pub/flutter_alien_signals/lib/src/mixins/signals.dart +++ b/pub/flutter_alien_signals/lib/src/mixins/signals.dart @@ -1,7 +1,8 @@ -import 'package:alien_signals/alien_signals.dart'; +import 'package:alien_signals/preset.dart'; import 'package:flutter/widgets.dart'; import '../_internal/signals_element.dart'; +import '../_internal/utils.dart'; mixin Signals on StatelessWidget { @override @@ -11,13 +12,15 @@ mixin Signals on StatelessWidget { } class _StatelessSignalsElement extends StatelessElement with SignalsElement { - _StatelessSignalsElement(super.widget) : scope = effectScope() { - effect = scope.run(() => Effect(markNeedsBuild)); + _StatelessSignalsElement(super.widget) : scopeStop = effectScope(loop) { + system.runEffectScope(scopeStop.sub, () { + effectStop = effect(markNeedsBuild); + }); } @override - final EffectScope scope; + final EffectStop scopeStop; @override - late final Effect effect; + late final EffectStop effectStop; } diff --git a/pub/flutter_alien_signals/lib/src/mixins/state_signals.dart b/pub/flutter_alien_signals/lib/src/mixins/state_signals.dart index 1290b32..ed70d8e 100644 --- a/pub/flutter_alien_signals/lib/src/mixins/state_signals.dart +++ b/pub/flutter_alien_signals/lib/src/mixins/state_signals.dart @@ -1,4 +1,4 @@ -import 'package:alien_signals/alien_signals.dart'; +import 'package:alien_signals/preset.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; @@ -8,10 +8,10 @@ import '../_internal/utils.dart'; mixin StateSignals on StatefulWidget { @override StatefulElement createElement() { - final scope = effectScope(); - final reset = scope.on(); + final stop = effectScope(loop); + final reset = stop.sub.on(); try { - return _SignalsElement(this, scope); + return _SignalsElement(this, stop); } finally { reset(); } @@ -19,19 +19,21 @@ mixin StateSignals on StatefulWidget { } class _SignalsElement extends StatefulElement with SignalsElement { - _SignalsElement(super.widget, this.scope) { - effect = scope.run(() => Effect(markNeedsBuild)); + _SignalsElement(super.widget, this.scopeStop) { + system.runEffectScope(scopeStop.sub, () { + effectStop = effect(markNeedsBuild); + }); } @override - final EffectScope scope; + final EffectStop scopeStop; @override - late final Effect effect; + late final EffectStop effectStop; @override void mount(Element? parent, Object? newSlot) { - final reset = scope.on(); + final reset = scopeStop.sub.on(); try { super.mount(parent, newSlot); } finally { diff --git a/pub/flutter_alien_signals/lib/src/upstream.dart b/pub/flutter_alien_signals/lib/src/upstream.dart index b09dd1b..4363cae 100644 --- a/pub/flutter_alien_signals/lib/src/upstream.dart +++ b/pub/flutter_alien_signals/lib/src/upstream.dart @@ -1,10 +1,2 @@ -export 'package:alien_signals/alien_signals.dart' - show - Signal, - Computed, - Effect, - EffectScope, - ISignal, - IWritableSignal, - untrack, - untrackScope; +export 'package:alien_signals/preset.dart' + show Signal, WriteableSignal, Computed, Effect, EffectScope; diff --git a/pub/flutter_alien_signals/lib/src/widgets/signal_observer.dart b/pub/flutter_alien_signals/lib/src/widgets/signal_observer.dart index 5d87cde..9de6c37 100644 --- a/pub/flutter_alien_signals/lib/src/widgets/signal_observer.dart +++ b/pub/flutter_alien_signals/lib/src/widgets/signal_observer.dart @@ -11,6 +11,6 @@ class SignalObserver extends SignalsWidget { @override Widget build(BuildContext context) { - return builder(context, signal.get()); + return builder(context, signal()); } } diff --git a/pub/flutter_alien_signals/pubspec.yaml b/pub/flutter_alien_signals/pubspec.yaml index 2c223d9..640a4c4 100644 --- a/pub/flutter_alien_signals/pubspec.yaml +++ b/pub/flutter_alien_signals/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_alien_signals description: >- Flutter Alien Signals is a Flutter binding based on Alien Signals. -version: 0.1.0 +version: 0.2.0 repository: https://github.com/medz/alien-signals-dart/tree/main/pub/flutter_alien_signals homepage: https://github.com/medz/alien-signals-dart @@ -24,7 +24,7 @@ environment: dependencies: flutter: sdk: flutter - alien_signals: ^0.1.0 + alien_signals: ^0.2.0 dev_dependencies: flutter_test: