From f74e16499d99a3d0b5c4877f65ff8440f1de3f7c Mon Sep 17 00:00:00 2001 From: jinyus Date: Thu, 14 Mar 2024 20:37:33 -0500 Subject: [PATCH] add entries to family beacon as a replacement for beacons getter. --- Readme.md | 2 +- .../lib/src/beacons/family.dart | 24 ++++++++++--------- .../test/src/beacons/family_test.dart | 19 ++++++++------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Readme.md b/Readme.md index d8e94664..7bbc366f 100644 --- a/Readme.md +++ b/Readme.md @@ -1188,7 +1188,7 @@ count.value = 40; An abstract mixin class that automatically disposes all beacons and effects created within it. This can be used to create a controller that manages a group of beacons. use the included [BeaconGroup](#beacongroup)(`B.writable()`) instead of `Beacon.writable()` to create beacons and effects. -NB: All beacons must be created with as a `late` variable. +NB: All beacons must be created as a `late` variable. ```dart class CountController extends BeaconController { diff --git a/packages/state_beacon_core/lib/src/beacons/family.dart b/packages/state_beacon_core/lib/src/beacons/family.dart index 587c21e6..fc39976f 100644 --- a/packages/state_beacon_core/lib/src/beacons/family.dart +++ b/packages/state_beacon_core/lib/src/beacons/family.dart @@ -11,19 +11,19 @@ class BeaconFamily> { late final _cache = {}; - late final _beacons = Beacon.list( + late final _entries = Beacon.list>( [], - name: 'family beacons list', + name: 'family entries', ); /// All beacons in the cache - ReadableBeacon> get beacons { + ReadableBeacon>> get entries { if (!_beaconsAccessed && _cache.isNotEmpty) { // populate the list on first access - _beacons.value = _cache.values.toList(); + _entries.value = _cache.entries.toList(); } _beaconsAccessed = true; - return _beacons; + return _entries; } final BeaconType Function(Arg) _create; @@ -47,13 +47,13 @@ class BeaconFamily> { beacon = _create(arg); _cache[arg] = beacon; - if (_beaconsAccessed) _beacons.add(beacon); + if (_beaconsAccessed) _entries.add(MapEntry(arg, beacon)); beacon.onDispose(() { if (_clearing) return; final removed = _cache.remove(arg); if (!_beaconsAccessed || removed == null) return; - _beacons.remove(removed); + _entries.removeWhere((e) => e.value == removed); }); return beacon; @@ -64,9 +64,11 @@ class BeaconFamily> { /// Removes a beacon from the cache if it exists. BeaconType? remove(Arg arg) { - final beacon = _cache.remove(arg); - if (beacon != null && _beaconsAccessed) _beacons.remove(beacon); - return beacon; + final removed = _cache.remove(arg); + if (removed != null && _beaconsAccessed) { + _entries.removeWhere((e) => e.value == removed); + } + return removed; } /// Clears the cache of beacon if caching is enabled. @@ -83,7 +85,7 @@ class BeaconFamily> { _clearing = false; _cache.clear(); - if (_beaconsAccessed) _beacons.clear(); + if (_beaconsAccessed) _entries.clear(); _beaconsAccessed = false; } } diff --git a/packages/state_beacon_core/test/src/beacons/family_test.dart b/packages/state_beacon_core/test/src/beacons/family_test.dart index 19260dbc..2c4a94d1 100644 --- a/packages/state_beacon_core/test/src/beacons/family_test.dart +++ b/packages/state_beacon_core/test/src/beacons/family_test.dart @@ -121,7 +121,7 @@ void main() { var ran = 0; - family.beacons.subscribe((_) => ran++, synchronous: true, startNow: false); + family.entries.subscribe((_) => ran++, synchronous: true, startNow: false); final beacon1 = family(1); final beacon2 = family(2); @@ -143,13 +143,16 @@ void main() { final beacon1 = family(1); final beacon2 = family(2); - expect(family.beacons.value, [beacon1, beacon2]); + List> getBeacons() => + family.entries.value.map((e) => e.value).toList(); - family.beacons.subscribe((_) => ran++, synchronous: true, startNow: false); + expect(getBeacons(), [beacon1, beacon2]); + + family.entries.subscribe((_) => ran++, synchronous: true, startNow: false); final beacon3 = family(3); - expect(family.beacons.value, [beacon1, beacon2, beacon3]); + expect(getBeacons(), [beacon1, beacon2, beacon3]); expect(ran, 1); @@ -159,19 +162,19 @@ void main() { beacon1.dispose(); - expect(family.beacons.value, [beacon2, beacon3]); + expect(getBeacons(), [beacon2, beacon3]); expect(ran, 2); family.remove(2); - expect(family.beacons.value, [beacon3]); + expect(getBeacons(), [beacon3]); expect(ran, 3); final beacon4 = family(4); - expect(family.beacons.value, [beacon3, beacon4]); + expect(getBeacons(), [beacon3, beacon4]); expect(ran, 4); @@ -180,7 +183,7 @@ void main() { family.clear(); - expect(family.beacons.value, isEmpty); + expect(getBeacons(), isEmpty); expect(ran, 5); });