Skip to content

Commit f4b4eb5

Browse files
committed
✨ enhance stream handling to include error management and emit initial value
1 parent 7f402d4 commit f4b4eb5

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

packages/hyper_storage/lib/src/hyper_storage.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -410,20 +410,25 @@ class HyperStorage extends _HyperStorageImpl {
410410
/// - Enum (requires providing [enumValues])
411411
Stream<E?> stream<E extends Object>(String key, {List<Enum>? enumValues}) async* {
412412
if (enumValues != null) checkEnumType<E>(enumValues);
413-
final E? itemValue = await get<E>(key, enumValues: enumValues);
414-
yield itemValue;
415413

416414
final controller = StreamController<E?>();
417415

418-
void retrieveAndAdd() async {
416+
Future<void> retrieveAndAdd() async {
419417
if (controller.isClosed) return;
420-
final E? value = await get<E>(key, enumValues: enumValues);
421-
if (!controller.isClosed) controller.add(value);
418+
try {
419+
final E? value = await get<E>(key, enumValues: enumValues);
420+
if (!controller.isClosed) controller.add(value);
421+
} catch (error, stacktrace) {
422+
if (!controller.isClosed) controller.addError(error, stacktrace);
423+
return;
424+
}
422425
}
423426

424427
addKeyListener(key, retrieveAndAdd);
425428

426429
try {
430+
// Reads and emits the initial value.
431+
await retrieveAndAdd();
427432
yield* controller.stream;
428433
} finally {
429434
removeKeyListener(key, retrieveAndAdd);

packages/hyper_storage/lib/src/hyper_storage_container.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,20 +282,25 @@ final class HyperStorageContainer extends StorageContainer with ItemHolderMixin,
282282
/// - Enum (requires providing [enumValues])
283283
Stream<E?> stream<E extends Object>(String key, {List<Enum>? enumValues}) async* {
284284
if (enumValues != null) checkEnumType<E>(enumValues);
285-
final E? itemValue = await get<E>(key, enumValues: enumValues);
286-
yield itemValue;
287285

288286
final controller = StreamController<E?>();
289287

290-
void retrieveAndAdd() async {
288+
Future<void> retrieveAndAdd() async {
291289
if (controller.isClosed) return;
292-
final E? value = await get<E>(key, enumValues: enumValues);
293-
if (!controller.isClosed) controller.add(value);
290+
try {
291+
final E? value = await get<E>(key, enumValues: enumValues);
292+
if (!controller.isClosed) controller.add(value);
293+
} catch (error, stacktrace) {
294+
if (!controller.isClosed) controller.addError(error, stacktrace);
295+
return;
296+
}
294297
}
295298

296299
addKeyListener(key, retrieveAndAdd);
297300

298301
try {
302+
// Reads and emits the initial value.
303+
await retrieveAndAdd();
299304
yield* controller.stream;
300305
} finally {
301306
removeKeyListener(key, retrieveAndAdd);

0 commit comments

Comments
 (0)