Skip to content

Commit 7f402d4

Browse files
committed
refactor stream controller handling to improve resource management and clarity
1 parent aea26db commit 7f402d4

File tree

2 files changed

+19
-22
lines changed

2 files changed

+19
-22
lines changed

packages/hyper_storage/lib/src/hyper_storage.dart

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -413,24 +413,21 @@ class HyperStorage extends _HyperStorageImpl {
413413
final E? itemValue = await get<E>(key, enumValues: enumValues);
414414
yield itemValue;
415415

416-
late final void Function() retrieveAndAdd;
417-
final controller = StreamController<E?>(
418-
onCancel: () => removeKeyListener(key, retrieveAndAdd),
419-
);
416+
final controller = StreamController<E?>();
420417

421-
retrieveAndAdd = () async {
418+
void retrieveAndAdd() async {
422419
if (controller.isClosed) return;
423420
final E? value = await get<E>(key, enumValues: enumValues);
424-
if (!controller.isClosed) {
425-
controller.add(value);
426-
}
427-
};
421+
if (!controller.isClosed) controller.add(value);
422+
}
428423

429424
addKeyListener(key, retrieveAndAdd);
430425

431-
yield* controller.stream;
432-
433-
// Defensive close call. Almost never reached because the stream is closed on cancel.
434-
await controller.close(); // coverage:ignore-line
426+
try {
427+
yield* controller.stream;
428+
} finally {
429+
removeKeyListener(key, retrieveAndAdd);
430+
await controller.close();
431+
}
435432
}
436433
}

packages/hyper_storage/lib/src/hyper_storage_container.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -285,22 +285,22 @@ final class HyperStorageContainer extends StorageContainer with ItemHolderMixin,
285285
final E? itemValue = await get<E>(key, enumValues: enumValues);
286286
yield itemValue;
287287

288-
late final void Function() retrieveAndAdd;
289-
final controller = StreamController<E?>(
290-
onCancel: () => removeKeyListener(key, retrieveAndAdd),
291-
);
288+
final controller = StreamController<E?>();
292289

293-
retrieveAndAdd = () async {
290+
void retrieveAndAdd() async {
294291
if (controller.isClosed) return;
295292
final E? value = await get<E>(key, enumValues: enumValues);
296293
if (!controller.isClosed) controller.add(value);
297-
};
294+
}
298295

299296
addKeyListener(key, retrieveAndAdd);
300297

301-
yield* controller.stream;
302-
// Defensive close call. Almost never reached because the stream is closed on cancel.
303-
await controller.close(); // coverage:ignore-line
298+
try {
299+
yield* controller.stream;
300+
} finally {
301+
removeKeyListener(key, retrieveAndAdd);
302+
await controller.close();
303+
}
304304
}
305305

306306
@override

0 commit comments

Comments
 (0)