make preferences a broadcast stream again

This commit is contained in:
Fabian Freund
2026-04-16 08:54:43 +02:00
parent c57a1d8f1b
commit eca74b283a
2 changed files with 37 additions and 23 deletions
@@ -125,40 +125,58 @@ Future<PreferenceSettingGroup> _preferenceSettingGroup(
@Riverpod() @Riverpod()
class _PreferenceRepository extends _$PreferenceRepository { class _PreferenceRepository extends _$PreferenceRepository {
final _prefManager = GeckoPrefService(); final _prefManager = GeckoPrefService();
late List<String> _prefNames;
late BehaviorSubject<Map<String, GeckoPref>> _prefSubject; late BehaviorSubject<Map<String, GeckoPref>> _prefSubject;
late Future<void> _ready;
Future<void> _updatePrefs() async { Future<void> _updatePrefs() async {
final groups = await ref.read( final prefs = _prefNames.isEmpty
_preferenceSettingGroupsProvider(partition).future,
);
final prefNames = groups.values
.map((group) => group.settings.keys)
.flattened
.toList();
final prefs = prefNames.isEmpty
? <String, GeckoPref>{} ? <String, GeckoPref>{}
: await _prefManager.getPrefs(prefNames); : await _prefManager.getPrefs(_prefNames);
if (!ref.mounted || _prefSubject.isClosed) {
return;
}
_prefSubject.add(prefs); _prefSubject.add(prefs);
} }
Future<void> applyPrefs(Map<String, Object> prefs) async { Future<void> applyPrefs(Map<String, Object> prefs) async {
await _ready;
await _prefManager.applyPrefs(prefs); await _prefManager.applyPrefs(prefs);
await _updatePrefs(); await _updatePrefs();
} }
Future<void> resetPrefs(List<String> prefNames) async { Future<void> resetPrefs(List<String> prefNames) async {
await _ready;
await _prefManager.resetPrefs(prefNames); await _prefManager.resetPrefs(prefNames);
await _updatePrefs(); await _updatePrefs();
} }
Future<void> _init(
Future<Map<String, PreferenceSettingGroup>> groupsFuture,
) async {
final groups = await groupsFuture;
_prefNames = groups.values
.map((group) => group.settings.keys)
.flattened
.toList();
await _updatePrefs();
}
Future<void> _refreshAfterReady() async {
await _ready;
await _updatePrefs();
}
@override @override
Raw<Stream<Map<String, GeckoPref>>> build( Raw<Stream<Map<String, GeckoPref>>> build(PreferencePartition partition) {
PreferencePartition partition, final groupsFuture = ref.watch(
) async* { _preferenceSettingGroupsProvider(partition).future,
final prefCompleter = Completer(); );
_prefSubject = BehaviorSubject<Map<String, GeckoPref>>(); _prefSubject = BehaviorSubject<Map<String, GeckoPref>>();
@@ -167,16 +185,12 @@ class _PreferenceRepository extends _$PreferenceRepository {
}); });
ref.onAddListener(() { ref.onAddListener(() {
if (prefCompleter.isCompleted) { unawaited(_refreshAfterReady());
ref.invalidateSelf();
}
}); });
await _updatePrefs().whenComplete(() { _ready = _init(groupsFuture);
prefCompleter.complete();
});
yield* _prefSubject.stream; return _prefSubject.stream;
} }
} }
@@ -334,7 +334,7 @@ final class _PreferenceRepositoryProvider
} }
String _$_preferenceRepositoryHash() => String _$_preferenceRepositoryHash() =>
r'b7a0aab286dd1f8da758de5cf259ad0c14b733d9'; r'c416d7684f1e8f24dd9e5fc98ecb6312c07d938f';
final class _PreferenceRepositoryFamily extends $Family final class _PreferenceRepositoryFamily extends $Family
with with