make preferences a broadcast stream again
This commit is contained in:
+36
-22
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user