From 135bbb594bd6eccb78707b3a6516f99ebe774344 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Tue, 21 Jan 2025 10:47:54 +0100 Subject: [PATCH] Fix broken stream initialization in some dart2js setups Avoiding a late final field weirdly seems to fix the issue. --- sqlite3/CHANGELOG.md | 4 ++ sqlite3/lib/src/implementation/database.dart | 52 +++++++++++--------- sqlite3/pubspec.yaml | 2 +- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/sqlite3/CHANGELOG.md b/sqlite3/CHANGELOG.md index 8a36c01c..8b8c142f 100644 --- a/sqlite3/CHANGELOG.md +++ b/sqlite3/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.7.2 + +- Web: Fix update events not being delivered in some shared worker setups. + ## 2.7.1 - Web: Fix a crash when using version `2.7.0` of this package with an older diff --git a/sqlite3/lib/src/implementation/database.dart b/sqlite3/lib/src/implementation/database.dart index 039bb0e2..bb21fea1 100644 --- a/sqlite3/lib/src/implementation/database.dart +++ b/sqlite3/lib/src/implementation/database.dart @@ -609,30 +609,9 @@ final class _StreamHandlers { /// Unregisters the native callback on the database. final void Function() _unregister; - late final Stream stream = Stream.multi( - (newListener) { - if (_database._isClosed) { - newListener.close(); - return; - } - - void addListener() { - _addAsyncListener(newListener); - } + Stream? _stream; - void removeListener() { - _removeAsyncListener(newListener); - } - - newListener - ..onPause = removeListener - ..onCancel = removeListener - ..onResume = addListener; - // Since this is a onListen callback, add listener now - addListener(); - }, - isBroadcast: true, - ); + Stream get stream => _stream!; _StreamHandlers({ required DatabaseImplementation database, @@ -640,7 +619,32 @@ final class _StreamHandlers { required void Function() unregister, }) : _database = database, _register = register, - _unregister = unregister; + _unregister = unregister { + _stream = Stream.multi( + (newListener) { + if (_database._isClosed) { + newListener.close(); + return; + } + + void addListener() { + _addAsyncListener(newListener); + } + + void removeListener() { + _removeAsyncListener(newListener); + } + + newListener + ..onPause = removeListener + ..onCancel = removeListener + ..onResume = addListener; + // Since this is a onListen callback, add listener now + addListener(); + }, + isBroadcast: true, + ); + } bool get hasListener => _asyncListeners.isNotEmpty || _syncCallback != null; diff --git a/sqlite3/pubspec.yaml b/sqlite3/pubspec.yaml index c9b5687f..83817229 100644 --- a/sqlite3/pubspec.yaml +++ b/sqlite3/pubspec.yaml @@ -1,6 +1,6 @@ name: sqlite3 description: Provides lightweight yet convenient bindings to SQLite by using dart:ffi -version: 2.7.1 +version: 2.7.2 homepage: https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3 issue_tracker: https://github.com/simolus3/sqlite3.dart/issues