From eca74b283ae89d24434ce1f86756e46550025af1 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Thu, 16 Apr 2026 08:54:43 +0200 Subject: [PATCH] make preferences a broadcast stream again --- .../repositories/preference_settings.dart | 58 ++++++++++++------- .../repositories/preference_settings.g.dart | 2 +- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart b/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart index ce0f604d..fb5063e1 100644 --- a/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart +++ b/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart @@ -125,40 +125,58 @@ Future _preferenceSettingGroup( @Riverpod() class _PreferenceRepository extends _$PreferenceRepository { final _prefManager = GeckoPrefService(); + + late List _prefNames; late BehaviorSubject> _prefSubject; + late Future _ready; Future _updatePrefs() async { - final groups = await ref.read( - _preferenceSettingGroupsProvider(partition).future, - ); - - final prefNames = groups.values - .map((group) => group.settings.keys) - .flattened - .toList(); - - final prefs = prefNames.isEmpty + final prefs = _prefNames.isEmpty ? {} - : await _prefManager.getPrefs(prefNames); + : await _prefManager.getPrefs(_prefNames); + + if (!ref.mounted || _prefSubject.isClosed) { + return; + } _prefSubject.add(prefs); } Future applyPrefs(Map prefs) async { + await _ready; await _prefManager.applyPrefs(prefs); await _updatePrefs(); } Future resetPrefs(List prefNames) async { + await _ready; await _prefManager.resetPrefs(prefNames); await _updatePrefs(); } + Future _init( + Future> groupsFuture, + ) async { + final groups = await groupsFuture; + + _prefNames = groups.values + .map((group) => group.settings.keys) + .flattened + .toList(); + + await _updatePrefs(); + } + + Future _refreshAfterReady() async { + await _ready; + await _updatePrefs(); + } + @override - Raw>> build( - PreferencePartition partition, - ) async* { - final prefCompleter = Completer(); + Raw>> build(PreferencePartition partition) { + final groupsFuture = ref.watch( + _preferenceSettingGroupsProvider(partition).future, + ); _prefSubject = BehaviorSubject>(); @@ -167,16 +185,12 @@ class _PreferenceRepository extends _$PreferenceRepository { }); ref.onAddListener(() { - if (prefCompleter.isCompleted) { - ref.invalidateSelf(); - } + unawaited(_refreshAfterReady()); }); - await _updatePrefs().whenComplete(() { - prefCompleter.complete(); - }); + _ready = _init(groupsFuture); - yield* _prefSubject.stream; + return _prefSubject.stream; } } diff --git a/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart b/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart index a44e216f..37a44ec6 100644 --- a/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart +++ b/apps/weblibre/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart @@ -334,7 +334,7 @@ final class _PreferenceRepositoryProvider } String _$_preferenceRepositoryHash() => - r'b7a0aab286dd1f8da758de5cf259ad0c14b733d9'; + r'c416d7684f1e8f24dd9e5fc98ecb6312c07d938f'; final class _PreferenceRepositoryFamily extends $Family with